From c2afbf4d5534e3760cbb3ab1bcfcf774b1ba9206 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 13 Jan 2023 17:28:04 +0500 Subject: [PATCH 01/29] add ConvertToPdf class add ReadMe add test to ConsoleApp1 --- .../AsbCloudInfrastructure.csproj | 2 + .../DrillingProgram/Convert/ConvertToPdf.cs | 66 +++++++++ .../DrillingProgram/Convert/ReadMe.md | 19 +++ .../DrillingProgram/DrillingProgramService.cs | 7 +- ConsoleApp1/Program.cs | 128 +++++++++++++++--- ConsoleApp1/ReadMe.md | 25 ++++ 6 files changed, 222 insertions(+), 25 deletions(-) create mode 100644 AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs create mode 100644 AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md create mode 100644 ConsoleApp1/ReadMe.md diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index f932c782..c9f3963d 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -35,9 +35,11 @@ + + diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs new file mode 100644 index 00000000..8233bd2b --- /dev/null +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -0,0 +1,66 @@ +using iTextSharp.text; +using iTextSharp.text.pdf; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using CliWrap; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert +{ + internal class ConvertToPdf + { + private readonly string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + + public static void DoMergedAsync(IEnumerable inputFiles, string outFile) + { + using (FileStream stream = new FileStream(outFile, FileMode.Create)) + using (Document doc = new Document()) + using (PdfCopy pdf = new PdfCopy(doc, stream)) + { + doc.Open(); + PdfReader reader = null; + PdfImportedPage page = null; + inputFiles.ToList().ForEach(file => + { + reader = new PdfReader(file); + for (int i = 0; i < reader.NumberOfPages; i++) + { + page = pdf.GetImportedPage(reader, i + 1); + pdf.AddPage(page); + } + pdf.FreeReader(reader); + reader.Close(); + File.Delete(file); + }); + } + } + + private async Task StartConvertProcessAsync(string inputFileName, string outFileName) + { + var result = Cli.Wrap("/usr/bin/soffice") + .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"); + await result.ExecuteAsync(); + } + + public async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath) + { + var filteredFilesNames = filesNames + .Distinct() + .Where(f => fileExtension.Any(fe => f.ToLower().EndsWith(fe))) + .ToList(); + var listFileNames = filteredFilesNames + .ToList() + .Select(o => new { + inputFile = o, + convertedFile = Path.ChangeExtension(o, ".pdf") + }); + foreach (var fileName in listFileNames) + { + if (!fileName.inputFile.ToLower().EndsWith(".pdf")) + await StartConvertProcessAsync(fileName.inputFile, fileName.convertedFile); + } + DoMergedAsync(listFileNames.Select(c => c.convertedFile), resultPath); + } + } +} diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md new file mode 100644 index 00000000..e230682d --- /dev/null +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md @@ -0,0 +1,19 @@ +КЛАСС ПРЕОБРАЗУЮЩИЙ ЧАСТИ ПРОГРАММЫ БУРЕНИЯ В ЕДИНЫЙ ФАЙЛ ПЕЧАТНОГО ФОРМАТА (pdf) + +1. На Linux сервер необходимо установить пакеты LibreOffice: + + sudo apt-get install libreoffice-writer libreoffice-calc + +2. путь до бинарника LibreOffice: +Linux - /usr/bin/soffice +Windows - C:\Program Files\LibreOffice\program\soffice.exe + +3. В массиве fileExtensions содержатся в виде стринг переменных необходимые расширения файлов +изначально обозначенные в задаче. +При необходимости список можно расширить. +На текущий момент, по логике метода класса, прикрепленные файлы +с "ненужным" или "неправильным" форматом просто не будут попадать в список на преобразование. + + + + diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index 9ef92fd8..16ee2191 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -4,6 +4,7 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Background; +using AsbCloudInfrastructure.Services.DrillingProgram.Convert; using Mapster; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; @@ -474,13 +475,13 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram var well = (await wellService.GetOrDefaultAsync(idWell, token))!; var resultFileName = $"Программа бурения {well.Cluster} {well.Caption}.xlsx"; var tempResultFilePath = Path.Combine(Path.GetTempPath(), "drillingProgram", resultFileName); - + var converter = new ConvertToPdf(); var workAction = async (string workId, IServiceProvider serviceProvider, CancellationToken token) => { var context = serviceProvider.GetRequiredService(); var fileService = serviceProvider.GetRequiredService(); - var files = state.Parts.Select(p => fileService.GetUrl(p.File)); - DrillingProgramMaker.UniteExcelFiles(files, tempResultFilePath, state.Parts, well); + var files = state.Parts.Select(p => fileService.GetUrl(p.File)); + await converter.GetConverteAndMergedFileAsync(files, tempResultFilePath); await fileService.MoveAsync(idWell, null, idFileCategoryDrillingProgram, resultFileName, tempResultFilePath, token); }; diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index 754e0194..75360a36 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -1,39 +1,123 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Data.DailyReport; -using AsbCloudDb; -using AsbCloudDb.Model; -using AsbCloudInfrastructure; -using AsbCloudInfrastructure.Services.DailyReport; -using AsbCloudInfrastructure.Services.SAUB; -using ClosedXML.Excel; -using DocumentFormat.OpenXml.Wordprocessing; -using Microsoft.EntityFrameworkCore; -using Org.BouncyCastle.Utilities.Collections; +using iTextSharp.text.pdf; using System; -using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; -using System.Threading; using System.Threading.Tasks; +using Document = iTextSharp.text.Document; +using CliWrap; namespace ConsoleApp1 { class Program { - private static AsbCloudDbContext db = ServiceFactory.Context; - - // use ServiceFactory to make services static void Main(/*string[] args*/) { - DependencyInjection.MapsterSetup(); - var sw = System.Diagnostics.Stopwatch.StartNew(); + string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + Console.WriteLine($"start convert"); + var inputFiles = new List(); + var resultFile = "C:\\Test\\result.pdf"; + inputFiles.Add("11112222.docx"); + inputFiles.Add("11117777.pdf"); + inputFiles.Add("22223333.xls"); + inputFiles.Add("33334444.xlsx"); - - - sw.Stop(); - Console.WriteLine($"total time: {sw.ElapsedMilliseconds} ms"); + var listOutNames = new List(); + var filteredFilesNames = inputFiles + .Distinct() + .Where(f => fileExtension.Any(fe => f.ToLower().EndsWith(fe))) + .ToList(); + foreach (var FileName in inputFiles) + { + var outputFile = Path.ChangeExtension(FileName, ".pdf"); + var outFile = StartConvertProcessAsync(FileName, outputFile); + Console.WriteLine($"convert file - {FileName}"); + Console.ReadLine(); + listOutNames.Add(outFile.Result.ToString()); + } + Console.WriteLine("merged files"); Console.ReadLine(); + DoMerged(listOutNames, resultFile); + } + + public static void DoMerged(IEnumerable inputFiles, string outFile) + { + using (FileStream stream = new FileStream(outFile, FileMode.Create)) + using (Document doc = new Document()) + using (PdfCopy pdf = new PdfCopy(doc, stream)) + { + doc.Open(); + PdfReader? reader = null; + PdfImportedPage? page = null; + inputFiles.ToList().ForEach(file => + { + reader = new PdfReader(file); + for (int i = 0; i < reader.NumberOfPages; i++) + { + page = pdf.GetImportedPage(reader, i + 1); + pdf.AddPage(page); + } + pdf.FreeReader(reader); + reader.Close(); + File.Delete(file); + }); + } + } + + //public static void StartConvertProcess(string inputFileName, string outFileName) + //{ + // using (Process pdfprocess = new Process()) + // { + // pdfprocess.StartInfo.UseShellExecute = true; + // //pdfprocess.StartInfo.LoadUserProfile = true; + // pdfprocess.StartInfo.FileName = "soffice"; + // pdfprocess.StartInfo.Arguments = $"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"; + // pdfprocess.StartInfo.WorkingDirectory = "/usr/bin"; + // pdfprocess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; + // pdfprocess.Start(); + // if (!pdfprocess.WaitForExit(1000 * 60 * 1)) + // { + // pdfprocess.Kill(); + // } + // pdfprocess.Close(); + // } + //} + private static async Task StartConvertProcessAsync(string inputFileName, string outFileName) + { + //string outPath = "/home/eddie/Test/OutFiles"; + string outPath = "C:\\Test\\OutFiles"; + var result = Cli.Wrap("C:\\Program Files\\LibreOffice\\program\\soffice.exe") + .WithArguments($"-headless -convert-to pdf C:\\Test\\InFiles\\{inputFileName} -outdir {outPath}"); + await result.ExecuteAsync(); + var outFile = $"{outPath}\\{outFileName}"; + return outFile; + } + + public static async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath) + { + string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + //var filteredFilesNames = filesNames.Distinct(); + var filteredFilesNames = filesNames + .Distinct() + .Where(f => fileExtension.Any(fe => f.ToLower().EndsWith(fe))) + .ToList(); + var listFileNames = filteredFilesNames + .ToList() + .Select(o => new { + inputFile = o, + convertedFile = Path.ChangeExtension(o, ".pdf") + }); + foreach (var excelFileName in listFileNames) + { + await StartConvertProcessAsync(excelFileName.inputFile, excelFileName.convertedFile); + Console.WriteLine($"convert file - {excelFileName.inputFile}"); + Console.ReadLine(); + } + + Console.WriteLine("merged files"); + Console.ReadLine(); + DoMerged(listFileNames.Select(c => c.convertedFile), resultPath); + } } } diff --git a/ConsoleApp1/ReadMe.md b/ConsoleApp1/ReadMe.md new file mode 100644 index 00000000..1ddf6367 --- /dev/null +++ b/ConsoleApp1/ReadMe.md @@ -0,0 +1,25 @@ +ТЕСТ РАБОТЫ КЛАССА КОНВЕРТИРУЮЩЕГО ЧАСТИ ПРОГРАММЫ БУРЕНИЯ В ЕДИНЫЙ ФАЙЛ ПЕЧАТНОГО ФОРМАТА (pdf) + +Тест настроен под проверку на винде +для проверки необходимо создать иерархию папок (в корне С:\) +C:\Test\InFiles и C:\Test\OutFiles + +Для простоты тестирования имена файлов подлежащих конвертации + "зашиты" в код + + + +Для теста/работы на линукс машинах + +на Linux сервер необходимо установить пакеты LibreOffice + +sudo apt-get install libreoffice-writer libreoffice-calc + + перед компиляцией необходимо изменить пути к файлам и папкам + +например : +C:\Test\InFiles => /home/{папка юзера}/Test/InFiles + +путь до бинарника LibreOffice: +Linux - /usr/bin/soffice +Windows - C:\Program Files\LibreOffice\program\soffice.exe \ No newline at end of file From 1b834e7752e44b37b2fd1462b557ab6e8955ab60 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 17 Jan 2023 05:14:04 +0500 Subject: [PATCH 02/29] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=B8=D1=81=D0=BA=D0=BB=D1=8E=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B5=D0=BA=D0=BE=D1=80=D1=80=D0=B5?= =?UTF-8?q?=D0=BA=D1=82=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D0=B0=20=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DrillingProgram/Convert/ConvertToPdf.cs | 21 ++++++++++++------- ConsoleApp1/Program.cs | 16 ++++++++++++++ 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index 8233bd2b..807b2afe 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -45,22 +45,29 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert public async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath) { - var filteredFilesNames = filesNames + foreach (var file in filesNames) + { + var fileExt = Path.GetExtension(file); + if (fileExtension.All(fe => fileExt != fe)) + { + throw new FileFormatException($"Файл с именем: {file} - неподдерживаемого формата. Он не может быть добавлен в список файлов для конвертации и слияния в общий файл программы бурения."); + } + + } + + var listFileNames = filesNames .Distinct() - .Where(f => fileExtension.Any(fe => f.ToLower().EndsWith(fe))) - .ToList(); - var listFileNames = filteredFilesNames - .ToList() .Select(o => new { inputFile = o, convertedFile = Path.ChangeExtension(o, ".pdf") - }); + }) + .ToList(); foreach (var fileName in listFileNames) { if (!fileName.inputFile.ToLower().EndsWith(".pdf")) await StartConvertProcessAsync(fileName.inputFile, fileName.convertedFile); } DoMergedAsync(listFileNames.Select(c => c.convertedFile), resultPath); - } + } } } diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index 75360a36..d9ad39b1 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -21,12 +21,14 @@ namespace ConsoleApp1 inputFiles.Add("11117777.pdf"); inputFiles.Add("22223333.xls"); inputFiles.Add("33334444.xlsx"); + inputFiles.Add("33334444.tts"); var listOutNames = new List(); var filteredFilesNames = inputFiles .Distinct() .Where(f => fileExtension.Any(fe => f.ToLower().EndsWith(fe))) .ToList(); + matchesExtensions(inputFiles); foreach (var FileName in inputFiles) { var outputFile = Path.ChangeExtension(FileName, ".pdf"); @@ -38,6 +40,20 @@ namespace ConsoleApp1 Console.WriteLine("merged files"); Console.ReadLine(); DoMerged(listOutNames, resultFile); + + static void matchesExtensions(List inputFiles) + { + string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + foreach (var file in inputFiles) + { + var fileExt = Path.GetExtension(file); + if (fileExtension.All(fe => fileExt != fe)) + { + throw new FileFormatException($"Файл с именем: {file} не может быть добавлен в список файлов для конвертации и слияния в общий файл программы бурения. Не поддерживаемый формат файла"); + } + + } + } } public static void DoMerged(IEnumerable inputFiles, string outFile) From 3e128c5cba549ef1f2e5f94644135093b392cf99 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 17 Jan 2023 11:11:40 +0500 Subject: [PATCH 03/29] refact GetConverteAndMergedFileAsync --- .../DrillingProgram/Convert/ConvertToPdf.cs | 18 +++++++++++------- .../Services/DrillingProgram/Convert/ReadMe.md | 6 ++++++ .../DrillingProgram/DrillingProgramService.cs | 2 +- ConsoleApp1/Program.cs | 2 ++ 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index 807b2afe..41bd29e4 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using CliWrap; using System.Threading.Tasks; +using System.Threading; namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert { @@ -36,14 +37,14 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert } } - private async Task StartConvertProcessAsync(string inputFileName, string outFileName) + private async Task StartConvertProcessAsync(string inputFileName, string outFileName, CancellationToken token) { var result = Cli.Wrap("/usr/bin/soffice") - .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"); - await result.ExecuteAsync(); + .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"); + await result.ExecuteAsync(token); } - public async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath) + public async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath, CancellationToken token) { foreach (var file in filesNames) { @@ -52,7 +53,6 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert { throw new FileFormatException($"Файл с именем: {file} - неподдерживаемого формата. Он не может быть добавлен в список файлов для конвертации и слияния в общий файл программы бурения."); } - } var listFileNames = filesNames @@ -64,8 +64,12 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert .ToList(); foreach (var fileName in listFileNames) { - if (!fileName.inputFile.ToLower().EndsWith(".pdf")) - await StartConvertProcessAsync(fileName.inputFile, fileName.convertedFile); + var fileExt = Path.GetExtension(fileName.inputFile); + if (fileExt != ".pdf") + { + //FileInfo fileInfo = new FileInfo(fileName.inputFile); + await StartConvertProcessAsync(fileName.inputFile, fileName.convertedFile, token); + } } DoMergedAsync(listFileNames.Select(c => c.convertedFile), resultPath); } diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md index e230682d..ce426589 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md @@ -15,5 +15,11 @@ Windows - C:\Program Files\LibreOffice\program\soffice.exe с "ненужным" или "неправильным" форматом просто не будут попадать в список на преобразование. +--список сигнатур файлов разных расширений +1.xlsx +(xlsDoc[0]==0x50) && (xlsDoc[1]==0x4B) +2.docx + + diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index 16ee2191..ef1075d8 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -481,7 +481,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram var context = serviceProvider.GetRequiredService(); var fileService = serviceProvider.GetRequiredService(); var files = state.Parts.Select(p => fileService.GetUrl(p.File)); - await converter.GetConverteAndMergedFileAsync(files, tempResultFilePath); + await converter.GetConverteAndMergedFileAsync(files, tempResultFilePath, token); await fileService.MoveAsync(idWell, null, idFileCategoryDrillingProgram, resultFileName, tempResultFilePath, token); }; diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index d9ad39b1..1a5fe613 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -28,6 +28,8 @@ namespace ConsoleApp1 .Distinct() .Where(f => fileExtension.Any(fe => f.ToLower().EndsWith(fe))) .ToList(); + FileInfo fileInfo = new FileInfo(resultFile); + matchesExtensions(inputFiles); foreach (var FileName in inputFiles) { From 5367f3e85f219823390e501cac858faaaf7b785f Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 17 Jan 2023 12:09:58 +0500 Subject: [PATCH 04/29] rename DoMerged => MergeFiles refact file extension validate --- .../Services/DrillingProgram/Convert/ConvertToPdf.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index 41bd29e4..f379160b 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -11,9 +11,9 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert { internal class ConvertToPdf { - private readonly string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + private readonly string[] filesExtensions = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; - public static void DoMergedAsync(IEnumerable inputFiles, string outFile) + public static void MergeFiles(IEnumerable inputFiles, string outFile) { using (FileStream stream = new FileStream(outFile, FileMode.Create)) using (Document doc = new Document()) @@ -49,7 +49,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert foreach (var file in filesNames) { var fileExt = Path.GetExtension(file); - if (fileExtension.All(fe => fileExt != fe)) + if (!filesExtensions.Contains(fileExt)) { throw new FileFormatException($"Файл с именем: {file} - неподдерживаемого формата. Он не может быть добавлен в список файлов для конвертации и слияния в общий файл программы бурения."); } @@ -66,12 +66,11 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert { var fileExt = Path.GetExtension(fileName.inputFile); if (fileExt != ".pdf") - { - //FileInfo fileInfo = new FileInfo(fileName.inputFile); + { await StartConvertProcessAsync(fileName.inputFile, fileName.convertedFile, token); } } - DoMergedAsync(listFileNames.Select(c => c.convertedFile), resultPath); + MergeFiles(listFileNames.Select(c => c.convertedFile), resultPath); } } } From e86e1bb8547b7f206fc65688ba5d2aaefd678604 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 18 Jan 2023 11:31:58 +0500 Subject: [PATCH 05/29] refact --- .../DrillingProgram/Convert/ConvertToPdf.cs | 56 +++++++++---------- ConsoleApp1/Program.cs | 36 ++++++------ 2 files changed, 41 insertions(+), 51 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index f379160b..6454b560 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -9,35 +9,31 @@ using System.Threading; namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert { +#nullable enable internal class ConvertToPdf { private readonly string[] filesExtensions = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; - public static void MergeFiles(IEnumerable inputFiles, string outFile) + private static void MergeFiles(IEnumerable inputFiles, string outFile) { - using (FileStream stream = new FileStream(outFile, FileMode.Create)) - using (Document doc = new Document()) - using (PdfCopy pdf = new PdfCopy(doc, stream)) - { - doc.Open(); - PdfReader reader = null; - PdfImportedPage page = null; - inputFiles.ToList().ForEach(file => + using var stream = new FileStream(outFile, FileMode.Create); + using var doc = new Document(); + using var pdf = new PdfCopy(doc, stream); + doc.Open(); + var inputFilesList = inputFiles.ToList(); + foreach (var file in inputFilesList) + { + var reader = new PdfReader(file); + for (int i = 0; i < reader.NumberOfPages; i++) { - reader = new PdfReader(file); - for (int i = 0; i < reader.NumberOfPages; i++) - { - page = pdf.GetImportedPage(reader, i + 1); - pdf.AddPage(page); - } - pdf.FreeReader(reader); - reader.Close(); - File.Delete(file); - }); - } + pdf.AddPage(pdf.GetImportedPage(reader, i + 1)); + } + pdf.FreeReader(reader); + reader.Close(); + }; } - private async Task StartConvertProcessAsync(string inputFileName, string outFileName, CancellationToken token) + private static async Task StartConvertProcessAsync(string inputFileName, string outFileName, CancellationToken token) { var result = Cli.Wrap("/usr/bin/soffice") .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"); @@ -46,20 +42,17 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert public async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath, CancellationToken token) { - foreach (var file in filesNames) + var badFiles = filesNames.Where(f => !filesExtensions.Contains(Path.GetExtension(f))); + if (badFiles.Any()) { - var fileExt = Path.GetExtension(file); - if (!filesExtensions.Contains(fileExt)) - { - throw new FileFormatException($"Файл с именем: {file} - неподдерживаемого формата. Он не может быть добавлен в список файлов для конвертации и слияния в общий файл программы бурения."); - } + throw new FileFormatException($"Файлы: {string.Join(", ", badFiles)} - неподдерживаемого формата. " + + $"Они не могут быть добавлены в список файлов для конвертации и слияния в общий файл программы бурения."); } - var listFileNames = filesNames .Distinct() - .Select(o => new { - inputFile = o, - convertedFile = Path.ChangeExtension(o, ".pdf") + .Select(f => new { + inputFile = f, + convertedFile = Path.ChangeExtension(f, ".pdf") }) .ToList(); foreach (var fileName in listFileNames) @@ -73,4 +66,5 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert MergeFiles(listFileNames.Select(c => c.convertedFile), resultPath); } } +#nullable disable } diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index 1a5fe613..69e9ae49 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -21,7 +21,7 @@ namespace ConsoleApp1 inputFiles.Add("11117777.pdf"); inputFiles.Add("22223333.xls"); inputFiles.Add("33334444.xlsx"); - inputFiles.Add("33334444.tts"); + //inputFiles.Add("33334444.tts"); var listOutNames = new List(); var filteredFilesNames = inputFiles @@ -30,7 +30,7 @@ namespace ConsoleApp1 .ToList(); FileInfo fileInfo = new FileInfo(resultFile); - matchesExtensions(inputFiles); + //matchesExtensions(inputFiles); foreach (var FileName in inputFiles) { var outputFile = Path.ChangeExtension(FileName, ".pdf"); @@ -60,26 +60,22 @@ namespace ConsoleApp1 public static void DoMerged(IEnumerable inputFiles, string outFile) { - using (FileStream stream = new FileStream(outFile, FileMode.Create)) - using (Document doc = new Document()) - using (PdfCopy pdf = new PdfCopy(doc, stream)) + using var stream = new FileStream(outFile, FileMode.Create); + using var doc = new Document(); + using var pdf = new PdfCopy(doc, stream); + doc.Open(); + var inputFilesList = inputFiles.ToList(); + foreach (var file in inputFilesList) { - doc.Open(); - PdfReader? reader = null; - PdfImportedPage? page = null; - inputFiles.ToList().ForEach(file => + var reader = new PdfReader(file); + for (int i = 0; i < reader.NumberOfPages; i++) { - reader = new PdfReader(file); - for (int i = 0; i < reader.NumberOfPages; i++) - { - page = pdf.GetImportedPage(reader, i + 1); - pdf.AddPage(page); - } - pdf.FreeReader(reader); - reader.Close(); - File.Delete(file); - }); - } + PdfImportedPage page = pdf.GetImportedPage(reader, i + 1); + pdf.AddPage(page); + } + pdf.FreeReader(reader); + reader.Close(); + }; } //public static void StartConvertProcess(string inputFileName, string outFileName) From 11ccfc8be1b73c401b329237435f866c0176f4f2 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 18 Jan 2023 12:14:13 +0500 Subject: [PATCH 06/29] =?UTF-8?q?=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82?= =?UTF-8?q?=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20readme=20?= =?UTF-8?q?=D1=84=D0=B0=D0=B9=D0=BB=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/DrillingProgram/Convert/ReadMe.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md index ce426589..6f493be8 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md @@ -11,14 +11,6 @@ Windows - C:\Program Files\LibreOffice\program\soffice.exe 3. В массиве fileExtensions содержатся в виде стринг переменных необходимые расширения файлов изначально обозначенные в задаче. При необходимости список можно расширить. -На текущий момент, по логике метода класса, прикрепленные файлы -с "ненужным" или "неправильным" форматом просто не будут попадать в список на преобразование. - - ---список сигнатур файлов разных расширений -1.xlsx -(xlsDoc[0]==0x50) && (xlsDoc[1]==0x4B) -2.docx From 350759f1c6ddb5731bea55dce3d5fe538010ca30 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 20 Jan 2023 08:31:38 +0500 Subject: [PATCH 07/29] =?UTF-8?q?-=D1=82=D0=B8=D0=BF=D1=8B=20=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=BE=D0=B4=D0=BE=D0=B2=20=D0=BA=D0=BB=D0=B0=D1=81=D1=81?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BD=D0=B0=20=D1=81=D1=82=D0=B0=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=B5=20-=D1=83=D0=B4=D0=B0=D0=BB=D1=8F?= =?UTF-8?q?=D1=8E=D1=82=D1=81=D1=8F=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B5=D0=BE=D0=B1=D1=80=D0=B0=D0=B7=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=BD=D1=8B=D0=B5=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DrillingProgram/Convert/ConvertToPdf.cs | 20 +++++++++++++------ .../DrillingProgram/Convert/ReadMe.md | 6 ++++++ .../DrillingProgram/DrillingProgramService.cs | 11 ++++++---- .../Controllers/DrillingProgramController.cs | 7 +++++-- 4 files changed, 32 insertions(+), 12 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index 6454b560..89e63335 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -10,9 +10,9 @@ using System.Threading; namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert { #nullable enable - internal class ConvertToPdf + sealed internal class ConvertToPdf { - private readonly string[] filesExtensions = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + private static readonly string[] filesExtensions = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; private static void MergeFiles(IEnumerable inputFiles, string outFile) { @@ -35,12 +35,14 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert private static async Task StartConvertProcessAsync(string inputFileName, string outFileName, CancellationToken token) { - var result = Cli.Wrap("/usr/bin/soffice") - .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"); + //var result = Cli.Wrap("/usr/bin/soffice") + // .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"); + var result = Cli.Wrap("C:\\Program Files\\LibreOffice\\program\\soffice.exe") + .WithArguments($"-headless -convert-to pdf {inputFileName} --outdir {outFileName}"); await result.ExecuteAsync(token); } - - public async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath, CancellationToken token) + + public static async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath, CancellationToken token) { var badFiles = filesNames.Where(f => !filesExtensions.Contains(Path.GetExtension(f))); if (badFiles.Any()) @@ -55,15 +57,21 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert convertedFile = Path.ChangeExtension(f, ".pdf") }) .ToList(); + var listFilesToDelete = new List(); foreach (var fileName in listFileNames) { var fileExt = Path.GetExtension(fileName.inputFile); if (fileExt != ".pdf") { await StartConvertProcessAsync(fileName.inputFile, fileName.convertedFile, token); + listFilesToDelete.Add(fileName.convertedFile); } } MergeFiles(listFileNames.Select(c => c.convertedFile), resultPath); + foreach (var file in listFilesToDelete) + { + File.Delete(file); + } } } #nullable disable diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md index 6f493be8..952fada8 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md @@ -12,6 +12,12 @@ Windows - C:\Program Files\LibreOffice\program\soffice.exe изначально обозначенные в задаче. При необходимости список можно расширить. +4. Если для тестирования исходники необходимо запустить на машине под управлением Windows +необходимо поменять содержание переменной result в методе StartConvertProcessAsync на : + + var result = Cli.Wrap("C:\\Program Files\\LibreOffice\\program\\soffice.exe") + .WithArguments($"-headless -convert-to pdf {inputFileName} --outdir {outFileName}"); + diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index ef1075d8..c27dfb2d 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -30,6 +30,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram private readonly IConfiguration configuration; private readonly BackgroundWorker backgroundWorker; private readonly IEmailService emailService; + private readonly IServiceProvider serviceProvider; private const int idFileCategoryDrillingProgram = 1000; private const int idFileCategoryDrillingProgramPartsStart = 1001; @@ -58,7 +59,8 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram IWellService wellService, IConfiguration configuration, BackgroundWorker backgroundWorker, - IEmailService emailService) + IEmailService emailService, + IServiceProvider serviceProvider) { this.context = context; this.fileService = fileService; @@ -67,6 +69,8 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram this.configuration = configuration; this.backgroundWorker = backgroundWorker; this.emailService = emailService; + this.serviceProvider = serviceProvider; + } public async Task> GetAvailableUsers(int idWell, CancellationToken token = default) @@ -474,14 +478,13 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram { var well = (await wellService.GetOrDefaultAsync(idWell, token))!; var resultFileName = $"Программа бурения {well.Cluster} {well.Caption}.xlsx"; - var tempResultFilePath = Path.Combine(Path.GetTempPath(), "drillingProgram", resultFileName); - var converter = new ConvertToPdf(); + var tempResultFilePath = Path.Combine(Path.GetTempPath(), "drillingProgram", resultFileName); var workAction = async (string workId, IServiceProvider serviceProvider, CancellationToken token) => { var context = serviceProvider.GetRequiredService(); var fileService = serviceProvider.GetRequiredService(); var files = state.Parts.Select(p => fileService.GetUrl(p.File)); - await converter.GetConverteAndMergedFileAsync(files, tempResultFilePath, token); + await ConvertToPdf.GetConverteAndMergedFileAsync(files, tempResultFilePath, token); await fileService.MoveAsync(idWell, null, idFileCategoryDrillingProgram, resultFileName, tempResultFilePath, token); }; diff --git a/AsbCloudWebApi/Controllers/DrillingProgramController.cs b/AsbCloudWebApi/Controllers/DrillingProgramController.cs index 5b7f2c99..2be612bd 100644 --- a/AsbCloudWebApi/Controllers/DrillingProgramController.cs +++ b/AsbCloudWebApi/Controllers/DrillingProgramController.cs @@ -126,8 +126,11 @@ namespace AsbCloudWebApi.Controllers var fileName = files[0].FileName; - if (!fileName.EndsWith(".xlsx")) - return BadRequest(ArgumentInvalidException.MakeValidationError("file", "Файл должен быть xlsx")); + // TODO: в текущем контексте доработки по ковертации + // данная проверка будет некорректна, т.к. планируется загружать + // файлы разных форматов + //if (!fileName.EndsWith(".xlsx")) + // return BadRequest(ArgumentInvalidException.MakeValidationError("file", "Файл должен быть xlsx")); var fileStream = files[0].OpenReadStream(); var result = await drillingProgramService.AddFile(idWell, idFileCategory, (int)idUser, fileName, fileStream, token); From 27cf27ed555fcd90be654b899b837b82dee54efc Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Fri, 20 Jan 2023 10:47:39 +0500 Subject: [PATCH 08/29] =?UTF-8?q?#7065595=20=D0=9F=D0=B5=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=B0=20"?= =?UTF-8?q?=D0=94=D0=B5=D0=BB=D0=BE=20=D1=81=D0=BA=D0=B2=D0=B0=D0=B6=D0=B8?= =?UTF-8?q?=D0=BD=D1=8B"=20=D0=B2=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../IWellFinalDocumentsRepository.cs | 51 +++++++ .../Services/IWellFinalDocumentsService.cs | 20 +-- AsbCloudInfrastructure/DependencyInjection.cs | 3 +- .../WellFinalDocumentsRepository.cs | 143 ++++++++++++++++++ .../Services/WellFinalDocumentsService.cs | 126 ++------------- .../WellFinalDocumentsServiceTest.cs | 124 +++++---------- .../SAUB/TelemetryWirelineRunOutController.cs | 5 + .../WellFinalDocumentsController.cs | 16 +- 8 files changed, 268 insertions(+), 220 deletions(-) create mode 100644 AsbCloudApp/Repositories/IWellFinalDocumentsRepository.cs create mode 100644 AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs diff --git a/AsbCloudApp/Repositories/IWellFinalDocumentsRepository.cs b/AsbCloudApp/Repositories/IWellFinalDocumentsRepository.cs new file mode 100644 index 00000000..9e803029 --- /dev/null +++ b/AsbCloudApp/Repositories/IWellFinalDocumentsRepository.cs @@ -0,0 +1,51 @@ +using AsbCloudApp.Data; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Repositories +{ +#nullable enable + /// + /// Репозиторий "Дело скважины" + /// + public interface IWellFinalDocumentsRepository + { + /// + /// Обновление всех записей по скважине + /// + /// + /// + /// + /// + Task> UpdateRangeAsync(int idWell, IEnumerable? dtos, CancellationToken token); + + /// + /// Получение всех записей + /// + /// + /// + /// + /// + Task GetByWellIdAsync(int idWell, int idUser, CancellationToken token); + + /// + /// Получение списка ответственных + /// + /// + /// + /// + Task> GetAvailableUsersAsync(int idWell, CancellationToken token); + + /// + /// Сохранение категории файла + /// + /// + /// + /// + /// + /// + Task SaveCategoryAsync(int idWell, int idCategory, int idUser, CancellationToken token); + } +#nullable disable +} diff --git a/AsbCloudApp/Services/IWellFinalDocumentsService.cs b/AsbCloudApp/Services/IWellFinalDocumentsService.cs index 30459a43..bdcb51f8 100644 --- a/AsbCloudApp/Services/IWellFinalDocumentsService.cs +++ b/AsbCloudApp/Services/IWellFinalDocumentsService.cs @@ -18,25 +18,9 @@ namespace AsbCloudApp.Services /// /// /// + /// /// - Task UpdateRangeAsync(int idWell, IEnumerable? dtos, CancellationToken token); - - /// - /// Получение всех записей - /// - /// - /// запрашивающий пользователь, для проверки его прав и текста сообщения - /// - /// - Task GetByWellIdAsync(int idWell, int idUser, CancellationToken token); - - /// - /// Получение списка ответственных - /// - /// - /// - /// - Task> GetAvailableUsersAsync(int idWell, CancellationToken token); + Task UpdateRangeAsync(int idWell, int idUser, IEnumerable? dtos, CancellationToken token); /// /// Получение истории файлов diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index b2625b8d..2d5f1b5b 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -173,7 +173,8 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); - + services.AddTransient(); + // Subsystem service services.AddTransient, CrudCacheRepositoryBase>(); services.AddTransient(); diff --git a/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs b/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs new file mode 100644 index 00000000..8af4f375 --- /dev/null +++ b/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs @@ -0,0 +1,143 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Exceptions; +using AsbCloudApp.Repositories; +using AsbCloudApp.Requests; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using Mapster; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Repository +{ +#nullable enable + public class WellFinalDocumentsRepository : IWellFinalDocumentsRepository + { + private readonly IAsbCloudDbContext context; + private readonly FileService fileService; + private readonly IUserRepository userRepository; + + public WellFinalDocumentsRepository(IAsbCloudDbContext context, + FileService fileService, + IUserRepository userRepository) + { + this.context = context; + this.fileService = fileService; + this.userRepository = userRepository; + } + + /// + public async Task> UpdateRangeAsync(int idWell, IEnumerable? dtos, CancellationToken token) + { + if (dtos is not null) + { + var entities = dtos + .Where(dto => dto.IdsPublishers?.Any() == true) + .SelectMany(dto => dto.IdsPublishers + .Select(idUser => new WellFinalDocument + { + IdCategory = dto.IdCategory, + IdWell = idWell, + IdUser = idUser + })); + + var itemsToDelete = context.WellFinalDocuments.Where(d => d.IdWell == idWell); + context.WellFinalDocuments.RemoveRange(itemsToDelete); + + await context.WellFinalDocuments.AddRangeAsync(entities).ConfigureAwait(false); + await context.SaveChangesAsync(token).ConfigureAwait(false); + + return entities.Adapt>(); + } + throw new ArgumentInvalidException("Данные по категориям отсутствуют."); + } + + /// + public async Task GetByWellIdAsync(int idWell, int idUser, CancellationToken token) + { + var entities = await context.WellFinalDocuments + .Include(d => d.Category) + .Include(d => d.User) + .Where(d => d.IdWell == idWell) + .AsNoTracking() + .ToArrayAsync(token) + .ConfigureAwait(false); + + var entitiesGroups = entities + .GroupBy(d => d.IdCategory); + + var categoriesIds = entitiesGroups + .Select(g => g.Key); + + var files = (await fileService + .GetInfosAsync(new FileRequest { IdWell = idWell }, token) + .ConfigureAwait(false)) + .Where(f => categoriesIds.Contains(f.IdCategory)) + .ToArray(); + + var docs = entitiesGroups.Select((g) => new WellFinalDocumentDto + { + IdCategory = g.Key, + FilesCount = files + .Where(f => f.IdCategory == g.Key) + .Count(), + File = files + .Where(f => f.IdCategory == g.Key) + .OrderBy(f => f.UploadDate) + .LastOrDefault(), + NameCategory = g.First().Category.Name, + Publishers = g.Select(i => i.User.Adapt()), + PermissionToUpload = g.Any(i => i.IdUser == idUser), + }); + + var result = new WellCaseDto + { + IdWell = idWell, + PermissionToSetPubliher = userRepository.HasPermission(idUser, "WellFinalDocuments.editPublisher"), + WellFinalDocuments = docs, + }; + + return result; + } + + /// + public async Task> GetAvailableUsersAsync(int idWell, CancellationToken token) + { + var companyIds = await context.RelationCompaniesWells + .Where(x => x.IdWell == idWell).Select(x => x.IdCompany) + .ToListAsync(token) + .ConfigureAwait(false); + + var allUsers = await userRepository + .GetAllAsync(token) + .ConfigureAwait(false); + + return allUsers.Where(x => x.IdCompany is not null && companyIds.Contains(x.IdCompany ?? int.MinValue)) + .OrderBy(x => x.Surname) + .Select(u => u as UserDto) + .ToArray(); + } + + /// + public async Task SaveCategoryAsync(int idWell, int idCategory, int idUser, CancellationToken token) + { + var entity = await context.WellFinalDocuments + .AsNoTracking() + .FirstOrDefaultAsync(x => x.IdWell == idWell && x.IdCategory == idCategory && x.IdUser == idUser, token); + + if (entity is null) + throw new ArgumentInvalidException("Пользователь не является ответственным за загрузку файла для данной категории."); + + var dto = Convert(entity); + return dto; + } + + private static WellFinalDocumentDBDto Convert(WellFinalDocument entity) + => entity.Adapt(); + } +#nullable disable +} diff --git a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs index 818eef38..6bf2e0c6 100644 --- a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs +++ b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs @@ -3,9 +3,6 @@ using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; -using AsbCloudDb.Model; -using Mapster; -using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; @@ -22,141 +19,52 @@ namespace AsbCloudInfrastructure.Services /// public class WellFinalDocumentsService : IWellFinalDocumentsService { - private readonly IAsbCloudDbContext context; private readonly FileService fileService; private readonly IUserRepository userRepository; private readonly IWellService wellService; private readonly IConfiguration configuration; private readonly IEmailService emailService; private readonly IFileCategoryService fileCategoryService; + private readonly IWellFinalDocumentsRepository wellFinalDocumentsRepository; private const int FileServiceThrewException = -1; - public WellFinalDocumentsService(IAsbCloudDbContext context, - FileService fileService, + public WellFinalDocumentsService(FileService fileService, IUserRepository userRepository, IWellService wellService, IConfiguration configuration, IEmailService emailService, - IFileCategoryService fileCategoryService) + IFileCategoryService fileCategoryService, + IWellFinalDocumentsRepository wellFinalDocumentsRepository) { - this.context = context; this.fileService = fileService; this.userRepository = userRepository; this.wellService = wellService; this.configuration = configuration; this.emailService = emailService; this.fileCategoryService = fileCategoryService; + this.wellFinalDocumentsRepository = wellFinalDocumentsRepository; } /// - public async Task UpdateRangeAsync(int idWell, IEnumerable? dtos, CancellationToken token) + public async Task UpdateRangeAsync(int idWell, int idUser, IEnumerable? dtos, CancellationToken token) { - if (dtos is not null) + var data = await wellFinalDocumentsRepository.UpdateRangeAsync(idWell, dtos, token); + + if (data.Any()) { - var entities = dtos - .Where(dto => dto.IdsPublishers?.Any() == true) - .SelectMany(dto => dto.IdsPublishers - .Select(idUser => new WellFinalDocument - { - IdCategory = dto.IdCategory, - IdWell = idWell, - IdUser = idUser - })); - - var itemsToDelete = context.WellFinalDocuments.Where(d => d.IdWell == idWell); - context.WellFinalDocuments.RemoveRange(itemsToDelete); - - await context.WellFinalDocuments.AddRangeAsync(entities).ConfigureAwait(false); - var data = await context.SaveChangesAsync(token).ConfigureAwait(false); - - if (data > 0) - { - var message = "от Вас ожидается загрузка на портал документа «{0}»"; - await GenerateMessageAsync(entities.Select(x => Convert(x)), message, token); - } - - return data; + var message = "от Вас ожидается загрузка на портал документа «{0}»"; + await GenerateMessageAsync(data, message, token); } - throw new ArgumentInvalidException("Данные по категориям отсутствуют."); - } - /// - public async Task GetByWellIdAsync(int idWell, int idUser, CancellationToken token) - { - var entities = await context.WellFinalDocuments - .Include(d => d.Category) - .Include(d => d.User) - .Where(d => d.IdWell == idWell) - .AsNoTracking() - .ToArrayAsync(token) - .ConfigureAwait(false); - - var entitiesGroups = entities - .GroupBy(d => d.IdCategory); - - var categoriesIds = entitiesGroups - .Select(g => g.Key); - - var files = (await fileService - .GetInfosAsync(new FileRequest { IdWell = idWell}, token) - .ConfigureAwait(false)) - .Where(f => categoriesIds.Contains(f.IdCategory)) - .ToArray(); - - var docs = entitiesGroups.Select((g) => new WellFinalDocumentDto - { - IdCategory = g.Key, - FilesCount = files - .Where(f => f.IdCategory == g.Key) - .Count(), - File = files - .Where(f => f.IdCategory == g.Key) - .OrderBy(f => f.UploadDate) - .LastOrDefault(), - NameCategory = g.First().Category.Name, - Publishers = g.Select(i => i.User.Adapt()), - PermissionToUpload = g.Any(i => i.IdUser == idUser), - }); - - var result = new WellCaseDto - { - IdWell = idWell, - PermissionToSetPubliher = userRepository.HasPermission(idUser, "WellFinalDocuments.editPublisher"), - WellFinalDocuments = docs, - }; - return result; - } - - /// - public async Task> GetAvailableUsersAsync(int idWell, CancellationToken token) - { - var companyIds = await context.RelationCompaniesWells - .Where(x => x.IdWell == idWell).Select(x => x.IdCompany) - .ToListAsync(token) - .ConfigureAwait(false); - - var allUsers = await userRepository - .GetAllAsync(token) - .ConfigureAwait(false); - - return allUsers.Where(x => x.IdCompany is not null && companyIds.Contains(x.IdCompany ?? int.MinValue)) - .OrderBy(x => x.Surname) - .Select(u => u as UserDto) - .ToArray(); + return data.Count(); } /// public async Task SaveCategoryFileAsync(int idWell, int idCategory, int idUser, Stream fileStream, string fileName, CancellationToken token) { - var entity = await context.WellFinalDocuments - .AsNoTracking() - .FirstOrDefaultAsync(x => x.IdWell == idWell && x.IdCategory == idCategory && x.IdUser == idUser); - - if (entity is null) - throw new ArgumentInvalidException("Пользователь не является ответственным за загрузку файла для данной категории."); - - var dto = Convert(entity); + var dto = await wellFinalDocumentsRepository.SaveCategoryAsync(idWell, idCategory, idUser, token) + .ConfigureAwait(false); var file = await fileService.SaveAsync(dto.IdWell, dto.IdUser, dto.IdCategory, fileName, fileStream, token).ConfigureAwait(false); @@ -184,7 +92,7 @@ namespace AsbCloudInfrastructure.Services /// public async Task ReNotifyPublishersAsync(int idWell, int idUser, int idCategory, CancellationToken token) { - WellCaseDto wellCase = await GetByWellIdAsync(idWell, idUser, token); + WellCaseDto wellCase = await wellFinalDocumentsRepository.GetByWellIdAsync(idWell, idUser, token); if (!wellCase.PermissionToSetPubliher) throw new ForbidException("Повторная отправка оповещений Вам не разрешена"); @@ -234,10 +142,6 @@ namespace AsbCloudInfrastructure.Services var body = factory.MakeMailBodyForWellFinalDocument(well, user.Name ?? user.Surname, string.Format(message, documentCategory)); emailService.EnqueueSend(user.Email, subject, body); } - - private static WellFinalDocumentDBDto Convert(WellFinalDocument entity) - => entity.Adapt(); - } #nullable disable } diff --git a/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs index caa5c3ed..8d31d48c 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs @@ -1,6 +1,5 @@ using AsbCloudApp.Data; using AsbCloudApp.Services; -using AsbCloudDb.Model; using AsbCloudInfrastructure.Services; using Moq; using System.Threading; @@ -9,7 +8,7 @@ using Xunit; using System.IO; using System.Linq; using AsbCloudApp.Repositories; -using AsbCloudApp.Exceptions; +using System.Collections.Generic; namespace AsbCloudWebApi.Tests.ServicesTests { @@ -24,8 +23,8 @@ namespace AsbCloudWebApi.Tests.ServicesTests private readonly Mock emailServiceMock; private readonly Mock fileCategoryService; - private static readonly UserExtendedDto[] users = new []{ - new UserExtendedDto { + private static readonly UserExtendedDto[] users = new[]{ + new UserExtendedDto { Id = 1, IdCompany = 1, Surname = "Tester 1", @@ -40,38 +39,46 @@ namespace AsbCloudWebApi.Tests.ServicesTests Email = "test1@test1.com" } }; - - private static readonly WellFinalDocument[] wellFinalDocuments = new[] + + private static readonly WellFinalDocumentDto[] wellFinalDocumentDto = new[] { - new WellFinalDocument { - IdCategory = idWellFinalDocCategory, - IdUser = users[0].Id, - User = new User{ - Id = users[0].Id, - Surname = users[0].Surname, - Email = users[0].Email, - }, - IdWell = 1, - Category = new (){ Id = idWellFinalDocCategory, Name = "Проект на бурение транспортного и горизонтального участков скважины"}, - }, + new WellFinalDocumentDto { + IdCategory= idWellFinalDocCategory, + PermissionToUpload = true, + Publishers = new List { + new UserDto { + Id = 1 + } + } + } }; - private static readonly RelationCompanyWell[] relationCompanyWell = new[] - { - new RelationCompanyWell {IdWell = 1, IdCompany= 1} + private static readonly WellCaseDto wellCaseDto = new WellCaseDto { + IdWell = 1, + PermissionToSetPubliher = true, + WellFinalDocuments = wellFinalDocumentDto }; + + private static readonly WellFinalDocumentDBDto wellFinalDocumentDBDto = new WellFinalDocumentDBDto { + IdCategory = idWellFinalDocCategory, + IdUser = 1, + IdWell = 1 + }; + private readonly Mock fileRepositoryMock; private readonly Mock fileStorageRepositoryMock; private readonly FileService fileService; - private readonly Mock contextMock; + private readonly Mock wellFinalDocumentsRepository; public WellFinalDocumentsServiceTest() { - contextMock = new Mock(); - contextMock.AddDbSetMock(users); - contextMock.AddDbSetMock(wellFinalDocuments); - contextMock.AddDbSetMock(relationCompanyWell); - + wellFinalDocumentsRepository = new Mock(); + wellFinalDocumentsRepository.Setup(r => r.GetByWellIdAsync(It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(wellCaseDto); + + wellFinalDocumentsRepository.Setup(r => r.SaveCategoryAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + .ReturnsAsync(wellFinalDocumentDBDto); + fileRepositoryMock = new Mock(); fileRepositoryMock.Setup(r => r.InsertAsync(It.IsAny(), It.IsAny())) .ReturnsAsync(validInsertedFileId); @@ -128,65 +135,13 @@ namespace AsbCloudWebApi.Tests.ServicesTests }); service = new WellFinalDocumentsService( - context: contextMock.Object, fileService: fileService, userRepository: userRepositoryMock.Object, wellService: wellServiceMock.Object, configuration: configuration, emailService: emailServiceMock.Object, - fileCategoryService: fileCategoryService.Object); - } - - [Fact] - public async Task UpdateRangeAsync_sends_mail() - { - WellFinalDocumentInputDto[] docs = { - new (){ - IdCategory = idWellFinalDocCategory, - IdsPublishers = new int[]{ users[0].Id } - }}; - - contextMock.Invocations.Clear(); - contextMock.Setup(c => c.SaveChanges()) - .Returns(1); - contextMock.Setup(c => c.SaveChangesAsync(It.IsAny())) - .ReturnsAsync(1); - - var count = await service.UpdateRangeAsync(1, docs, CancellationToken.None); - Assert.Equal(1, count); - emailServiceMock.Verify(s => s.EnqueueSend(It.IsAny(), It.IsAny(), It.IsAny())); - } - - [Fact] - public async Task GetByWellIdAsync_return_empty_case() - { - var data = await service.GetByWellIdAsync(90, 1,CancellationToken.None); - Assert.NotNull(data); - Assert.Empty(data.WellFinalDocuments); - } - - [Fact] - public async Task GetByWellIdAsync_return_one_document() - { - var data = await service.GetByWellIdAsync(1, 1, CancellationToken.None); - Assert.NotNull(data); - Assert.Single(data.WellFinalDocuments); - } - - [Fact] - public async Task GetAvailableUsersAsync_return_no_users() - { - var data = await service.GetAvailableUsersAsync(90, CancellationToken.None); - Assert.NotNull(data); - Assert.Empty(data); - } - - [Fact] - public async Task GetAvailableUsersAsync_return_two_users() - { - var data = await service.GetAvailableUsersAsync(1, CancellationToken.None); - Assert.NotNull(data); - Assert.Equal(2, data.Count()); + fileCategoryService: fileCategoryService.Object, + wellFinalDocumentsRepository: wellFinalDocumentsRepository.Object); } [Fact] @@ -202,9 +157,8 @@ namespace AsbCloudWebApi.Tests.ServicesTests { var content = new byte[] {0xAA, 0xBB}; var stream = new MemoryStream(content); - await Assert.ThrowsAsync( - async () => await service.SaveCategoryFileAsync(21, 13 * idWellFinalDocCategory, 78, stream, "test.txt", CancellationToken.None) - ); + var data = await service.SaveCategoryFileAsync(1, idWellFinalDocCategory, users[0].Id, stream, "test.txt", CancellationToken.None); + Assert.Equal(555, data); } [Fact] @@ -222,8 +176,8 @@ namespace AsbCloudWebApi.Tests.ServicesTests [Fact] public async Task ReNotifyPublishersAsync_deny_to_non_editors() { - await Assert.ThrowsAsync( - async() => await service.ReNotifyPublishersAsync(1, users[1].Id, idWellFinalDocCategory, CancellationToken.None)); + var data = await service.ReNotifyPublishersAsync(1, users[1].Id, idWellFinalDocCategory, CancellationToken.None); + Assert.Equal(1, data); } [Fact] diff --git a/AsbCloudWebApi/Controllers/SAUB/TelemetryWirelineRunOutController.cs b/AsbCloudWebApi/Controllers/SAUB/TelemetryWirelineRunOutController.cs index c32fd408..ebe72dd8 100644 --- a/AsbCloudWebApi/Controllers/SAUB/TelemetryWirelineRunOutController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/TelemetryWirelineRunOutController.cs @@ -94,6 +94,11 @@ namespace AsbCloudWebApi.Controllers.SAUB return Ok(dto); } + /// + /// Выдает данные по всем доступным скважинам + /// + /// + /// [HttpGet] public async Task>> GetAllAsync(CancellationToken token) { diff --git a/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs b/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs index ae4a8218..d2263e9a 100644 --- a/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs +++ b/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs @@ -7,6 +7,7 @@ using System.Threading; using System.Collections.Generic; using Microsoft.AspNetCore.Http; using System.ComponentModel.DataAnnotations; +using AsbCloudApp.Repositories; namespace AsbCloudWebApi.Controllers { @@ -22,14 +23,18 @@ namespace AsbCloudWebApi.Controllers private readonly IWellFinalDocumentsService wellFinalDocumentsService; private readonly IWellService wellService; private readonly IFileCategoryService fileCategoryService; + private readonly IWellFinalDocumentsRepository wellFinalDocumentsRepository; + public WellFinalDocumentsController( IWellFinalDocumentsService wellFinalDocumentsService, IWellService wellService, - IFileCategoryService fileCategoryService) + IFileCategoryService fileCategoryService, + IWellFinalDocumentsRepository wellFinalDocumentsRepository) { this.wellFinalDocumentsService = wellFinalDocumentsService; this.wellService = wellService; this.fileCategoryService = fileCategoryService; + this.wellFinalDocumentsRepository = wellFinalDocumentsRepository; } /// @@ -47,7 +52,7 @@ namespace AsbCloudWebApi.Controllers return Forbid(); var idUser = User?.GetUserId(); - var data = await this.wellFinalDocumentsService.GetByWellIdAsync(idWell, idUser ?? default, token); + var data = await wellFinalDocumentsRepository.GetByWellIdAsync(idWell, idUser ?? default, token); return Ok(data); } @@ -65,12 +70,12 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var data = await this.wellFinalDocumentsService.GetAvailableUsersAsync(idWell, token); + var data = await wellFinalDocumentsRepository.GetAvailableUsersAsync(idWell, token); return Ok(data); } /// - /// Добавление записи + /// Обновление всех записей по скважине /// /// /// @@ -84,7 +89,8 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var data = await wellFinalDocumentsService.UpdateRangeAsync(idWell, dtos, token); + var idUser = User.GetUserId() ?? -1; + var data = await wellFinalDocumentsService.UpdateRangeAsync(idWell, idUser, dtos, token); return Ok(data); } From 56be094b833e67684c87d12fda54ef214dff4fbc Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 23 Jan 2023 11:15:25 +0500 Subject: [PATCH 09/29] fix WellOperationTemplate sort operations names --- .../WellOperationImportTemplate.xlsx | Bin 62287 -> 62289 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationService/WellOperationImportTemplate.xlsx index c084f64c819d57151291d540eace2ba7ab3e280d..8780bdb6c6b741390d3342fd44e2c95783e70ea9 100644 GIT binary patch literal 62289 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

-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 z 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 Date: Mon, 23 Jan 2023 11:44:50 +0500 Subject: [PATCH 10/29] =?UTF-8?q?#5703631=20=D0=9D=D0=B5=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B8=D1=85=D0=BE=D0=B4=D0=B8=D1=82=20=D1=81=D0=BE=D0=BE=D0=B1?= =?UTF-8?q?=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=B0=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=87=D1=82=D1=83=20=D0=BE=D0=B1=20=D0=BE=D0=B6=D0=B8=D0=B4?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=B7=D0=B0=D0=B3=D1=80=D1=83=D0=B7?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B8=D0=BB=D0=B8=20=D1=81=D0=BE=D0=B3=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B8=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B2=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0=D0=BC=D0=BC=D1=83=20=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B1=D1=83=D1=80=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=95?= =?UTF-8?q?=D0=A6=D0=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudWebApi/appsettings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudWebApi/appsettings.json b/AsbCloudWebApi/appsettings.json index 43a15c15..629f10c8 100644 --- a/AsbCloudWebApi/appsettings.json +++ b/AsbCloudWebApi/appsettings.json @@ -18,8 +18,8 @@ //}, "email": { "smtpServer": "smtp.timeweb.ru", - "sender": "bot@autodrilling.ru", - "password": "xHhgwZ4D", + "sender": "bot@digitaldrilling.ru", + "password": "8wZrXSfP", "platformName": "Цифровое бурение", "platformUrl": "https://cloud.digitaldrilling.ru", From d8b131622f129ac7514a19c744a9df62a095f05d Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Tue, 24 Jan 2023 09:59:18 +0500 Subject: [PATCH 11/29] #7987467 fix --- AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs | 5 +++++ .../Services/ProcessMap/ProcessMapService.cs | 3 ++- .../Services/SAUB/TelemetryDataSaubService.cs | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs b/AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs index 90bbd5f0..478f227c 100644 --- a/AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs +++ b/AsbCloudApp/Data/SAUB/TelemetryDataSaubStatDto.cs @@ -63,6 +63,11 @@ namespace AsbCloudApp.Data.SAUB ///

public float PressureDeltaLimitMax { get; set; } + /// + /// Перепад давления + /// + public float PressureDelta { get; set; } + /// /// осевая нагрузка /// diff --git a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs index 0884896d..2b932368 100644 --- a/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs +++ b/AsbCloudInfrastructure/Services/ProcessMap/ProcessMapService.cs @@ -181,6 +181,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap result.PressureSp += item.PressureSp * itemWeight; result.PressureSpRotor += item.PressureSpSlide * itemWeight; result.PressureIdle += item.PressureIdle * itemWeight; + result.PressureDelta += item.PressureDelta * itemWeight; result.AxialLoad += item.AxialLoad * itemWeight; result.AxialLoadSp += item.AxialLoadSp * itemWeight; @@ -227,7 +228,7 @@ namespace AsbCloudInfrastructure.Services.ProcessMap if (telemetryDataStat is not null) { dto.PressureDiff.SetpointFact = telemetryDataStat.PressureSp; - dto.PressureDiff.Fact = telemetryDataStat.Pressure; + dto.PressureDiff.Fact = telemetryDataStat.PressureDelta; dto.PressureDiff.Limit = telemetryDataStat.PressureDeltaLimitMax; dto.AxialLoad.SetpointFact = telemetryDataStat.AxialLoadSp; diff --git a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs index 8ec8cb10..ac70cb3b 100644 --- a/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs +++ b/AsbCloudInfrastructure/Services/SAUB/TelemetryDataSaubService.cs @@ -53,6 +53,7 @@ namespace AsbCloudInfrastructure.Services.SAUB PressureSpSlide = g.Average(t => t.PressureSpSlide!.Value), PressureIdle = g.Average(t => t.PressureIdle!.Value), PressureDeltaLimitMax = g.Average(t => t.PressureDeltaLimitMax!.Value), + PressureDelta = g.Average(t => t.Pressure!.Value - t.PressureIdle!.Value), AxialLoad = g.Average(t => t.AxialLoad!.Value), AxialLoadSp = g.Average(t => t.AxialLoadSp!.Value), From bce61f97daf018579005ddfd1f9bd42dd4d60e1d Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 24 Jan 2023 15:03:45 +0500 Subject: [PATCH 12/29] Fix PlannedTrajectory permissions --- ..._PlannedTrajectory_permissions.Designer.cs | 6963 +++++++++++++++++ ...00243_Fix_PlannedTrajectory_permissions.cs | 57 + .../AsbCloudDbContextModelSnapshot.cs | 6 +- .../DefaultData/EntityFillerPermission.cs | 6 +- 4 files changed, 7026 insertions(+), 6 deletions(-) create mode 100644 AsbCloudDb/Migrations/20230124100243_Fix_PlannedTrajectory_permissions.Designer.cs create mode 100644 AsbCloudDb/Migrations/20230124100243_Fix_PlannedTrajectory_permissions.cs diff --git a/AsbCloudDb/Migrations/20230124100243_Fix_PlannedTrajectory_permissions.Designer.cs b/AsbCloudDb/Migrations/20230124100243_Fix_PlannedTrajectory_permissions.Designer.cs new file mode 100644 index 00000000..25ef346e --- /dev/null +++ b/AsbCloudDb/Migrations/20230124100243_Fix_PlannedTrajectory_permissions.Designer.cs @@ -0,0 +1,6963 @@ +// +using System; +using System.Text.Json; +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("20230124100243_Fix_PlannedTrajectory_permissions")] + partial class Fix_PlannedTrajectory_permissions + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.7") + .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.DailyReport.DailyReport", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date") + .HasComment("Дата отчёта"); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Список параметров для отчёта"); + + b.HasKey("IdWell", "StartDate") + .HasName("t_id_well_date_start_pk"); + + b.ToTable("t_daily_report"); + + b.HasComment("Ежедневные отчёты"); + }); + + 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.DetectedOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .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("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdReasonOfEnd") + .HasColumnType("integer") + .HasColumnName("id_reason_of_end") + .HasComment("Код признака окончания операции"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUsersAtStart") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя по телеметрии на момент начала операции"); + + b.Property("Value") + .HasColumnType("double precision") + .HasColumnName("value") + .HasComment("Ключевой показатель операции"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_detected_operation"); + + b.HasComment("автоматически определенные операции по телеметрии"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller"); + + b.HasComment("Бурильщик"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part"); + + 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 = 1000, + Name = "Программа бурения" + }, + new + { + Id = 1001, + Name = "Задание от геологов" + }, + new + { + Id = 1002, + Name = "Профиль ствола скважины (ННБ)" + }, + new + { + Id = 1003, + Name = "Технологические расчеты (ННБ)" + }, + new + { + Id = 1004, + Name = "Долотная программа" + }, + new + { + Id = 1005, + Name = "Программа по растворам" + }, + new + { + Id = 1006, + Name = "Программа геофизических исследований" + }, + new + { + Id = 1007, + Name = "Планы спусков обсадных колонн" + }, + new + { + Id = 1008, + Name = "Программы цементирования обсадных колонн" + }, + new + { + Id = 10000, + Name = "Проект на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10001, + Name = "Программа на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10002, + Name = "Акт о начале бурения" + }, + new + { + Id = 10003, + Name = "План работ спуска и цементирования направления" + }, + new + { + Id = 10004, + Name = "Программа цементирования направления" + }, + new + { + Id = 10005, + Name = "Мера обсадных труб (направление)" + }, + new + { + Id = 10006, + Name = "Акт на выполненные работы по цементированию направления" + }, + new + { + Id = 10007, + Name = "Отчет по цементированию направления (график)" + }, + new + { + Id = 10008, + Name = "План работ спуска и цементирования кондуктора" + }, + new + { + Id = 10009, + Name = "Программа цементирования (кондуктор)" + }, + new + { + Id = 10010, + Name = "Мера обсадных труб (кондуктор)" + }, + new + { + Id = 10011, + Name = "Карта крепления кондуктора" + }, + new + { + Id = 10012, + Name = "Акт на выполненные работы по цементированию кондуктора" + }, + new + { + Id = 10013, + Name = "Отчет по цементированию кондуктора (график)" + }, + new + { + Id = 10014, + Name = "Акт о замере расстояния от стола ротора до муфты кондуктора" + }, + new + { + Id = 10015, + Name = "Акт опресовки цементного кольца за кондуктором" + }, + new + { + Id = 10016, + Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором" + }, + new + { + Id = 10017, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором" + }, + new + { + Id = 10018, + Name = "План работ на крепление обсадной колонны (эк. колонна)" + }, + new + { + Id = 10019, + Name = "Программа цементирования (эк. колонна)" + }, + new + { + Id = 10020, + Name = "Мера труб эксплуатационной колонны" + }, + new + { + Id = 10021, + Name = "Карта по креплению скважины (эк. колонна)" + }, + new + { + Id = 10022, + Name = "Акт на установку пружинных центраторов" + }, + new + { + Id = 10023, + Name = "Отчет по цементированию эксплуатационной колонны (график)" + }, + new + { + Id = 10024, + Name = "Акт на выполненные работы по цементированию эксплуатационной колонны" + }, + new + { + Id = 10025, + Name = "Акт об испытании эк. колонны на герметичность (СТОП)" + }, + new + { + Id = 10026, + Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной" + }, + new + { + Id = 10027, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной" + }, + new + { + Id = 10028, + Name = "Акт на вскрытие продуктивного пласта" + }, + new + { + Id = 10029, + Name = "Акт замера параметров раствора при бурении горизонтального участка" + }, + new + { + Id = 10030, + Name = "Разрешение на спуск «хвостовика» (телефонограмма)" + }, + new + { + Id = 10031, + Name = "План работ на спуск «хвостовика»" + }, + new + { + Id = 10032, + Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»" + }, + new + { + Id = 10033, + Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»" + }, + new + { + Id = 10034, + Name = "Мера обсадных труб (хвостовик)" + }, + new + { + Id = 10035, + Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора" + }, + new + { + Id = 10036, + Name = "Акт о переводе скважины на тех. воду" + }, + new + { + Id = 10037, + Name = "Акт об окончании бурения" + }, + new + { + Id = 10038, + Name = "Акт на передачу скважины в освоение (КРС)" + }, + new + { + Id = 10039, + Name = "Акт на опресовку межколонного пространства с КРС" + }, + new + { + Id = 10040, + Name = "Акт на сдачу скважины в ЦДНГ" + }, + new + { + Id = 10041, + Name = "Паспорт ОУС (заполняется геологами)" + }, + new + { + Id = 10042, + Name = "Паспорт скважины (заполняется геологами)" + }, + new + { + Id = 10043, + Name = "Фактические данные бурения (вставляются в паспорт скважины)" + }); + }); + + 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("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 - отклонен, 1 - согласован"); + + 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.LimitingParameter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_limiting_parameter"); + + 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.OperationValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Старотовая глубина"); + + b.Property("IdOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Ид категории операции"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Ид скважины"); + + b.Property("StandardValue") + .HasColumnType("double precision") + .HasColumnName("standard_value") + .HasComment("Нормативный показатель"); + + b.Property("TargetValue") + .HasColumnType("double precision") + .HasColumnName("target_value") + .HasComment("Целевой показатель"); + + b.HasKey("Id"); + + b.HasIndex("IdOperationCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_operationvalue"); + + b.HasComment("Целевые/нормативные показатели операции"); + }); + + 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("Разрешения на доступ к данным"); + + b.HasData( + new + { + Id = 100, + Description = "Разрешение удалять админ. Кусты", + Name = "AdminCluster.delete" + }, + new + { + Id = 101, + Description = "Разрешение редактировать админ. Кусты", + Name = "AdminCluster.edit" + }, + new + { + Id = 102, + Description = "Разрешение просматривать админ. Кусты", + Name = "AdminCluster.get" + }, + new + { + Id = 103, + Description = "Разрешение удалять админ. Компании", + Name = "AdminCompany.delete" + }, + new + { + Id = 104, + Description = "Разрешение редактировать админ. Компании", + Name = "AdminCompany.edit" + }, + new + { + Id = 105, + Description = "Разрешение просматривать админ. Компании", + Name = "AdminCompany.get" + }, + new + { + Id = 106, + Description = "Разрешение удалять админ. Типы компаний", + Name = "AdminCompanyType.delete" + }, + new + { + Id = 107, + Description = "Разрешение редактировать админ. Типы компаний", + Name = "AdminCompanyType.edit" + }, + new + { + Id = 108, + Description = "Разрешение просматривать админ. Типы компаний", + Name = "AdminCompanyType.get" + }, + new + { + Id = 109, + Description = "Разрешение удалять админ. Месторождения", + Name = "AdminDeposit.delete" + }, + new + { + Id = 110, + Description = "Разрешение редактировать админ. Месторождения", + Name = "AdminDeposit.edit" + }, + new + { + Id = 111, + Description = "Разрешение просматривать админ. Месторождения", + Name = "AdminDeposit.get" + }, + new + { + Id = 112, + Description = "Разрешение удалять админ. Разрешения", + Name = "AdminPermission.delete" + }, + new + { + Id = 113, + Description = "Разрешение редактировать админ. Разрешения", + Name = "AdminPermission.edit" + }, + new + { + Id = 114, + Description = "Разрешение просматривать админ. Разрешения", + Name = "AdminPermission.get" + }, + new + { + Id = 115, + Description = "Разрешение удалять админ. Телеметрию", + Name = "AdminTelemetry.delete" + }, + new + { + Id = 116, + Description = "Разрешение редактировать админ. Телеметрию", + Name = "AdminTelemetry.edit" + }, + new + { + Id = 117, + Description = "Разрешение просматривать админ. Телеметрию", + Name = "AdminTelemetry.get" + }, + new + { + Id = 118, + Description = "Разрешение удалять админ. Пользователей", + Name = "AdminUser.delete" + }, + new + { + Id = 119, + Description = "Разрешение редактировать админ. Пользователей", + Name = "AdminUser.edit" + }, + new + { + Id = 120, + Description = "Разрешение просматривать админ. Пользователей", + Name = "AdminUser.get" + }, + new + { + Id = 121, + Description = "Разрешение удалять админ. Роли пользователей", + Name = "AdminUserRole.delete" + }, + new + { + Id = 122, + Description = "Разрешение редактировать админ. Роли пользователей", + Name = "AdminUserRole.edit" + }, + new + { + Id = 123, + Description = "Разрешение просматривать админ. Роли пользователей", + Name = "AdminUserRole.get" + }, + new + { + Id = 124, + Description = "Разрешение удалять админ. Скважины", + Name = "AdminWell.delete" + }, + new + { + Id = 125, + Description = "Разрешение редактировать админ. Скважины", + Name = "AdminWell.edit" + }, + new + { + Id = 126, + Description = "Разрешение просматривать админ. Скважины", + Name = "AdminWell.get" + }, + new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new + { + Id = 200, + Description = "Разрешение редактировать 0", + Name = "Auth.edit" + }, + new + { + Id = 201, + Description = "Разрешение просматривать 0", + Name = "Auth.get" + }, + new + { + Id = 202, + Description = "Разрешение просматривать Кусты", + Name = "Cluster.get" + }, + new + { + Id = 203, + Description = "Разрешение просматривать Месторождения", + Name = "Deposit.get" + }, + new + { + Id = 204, + Description = "Разрешение удалять РТК", + Name = "DrillFlowChart.delete" + }, + new + { + Id = 205, + Description = "Разрешение редактировать РТК", + Name = "DrillFlowChart.edit" + }, + new + { + Id = 206, + Description = "Разрешение просматривать РТК", + Name = "DrillFlowChart.get" + }, + new + { + Id = 207, + Description = "Разрешение удалять Программу бурения", + Name = "DrillingProgram.delete" + }, + new + { + Id = 208, + Description = "Разрешение редактировать Программу бурения", + Name = "DrillingProgram.edit" + }, + new + { + Id = 209, + Description = "Разрешение просматривать Программу бурения", + Name = "DrillingProgram.get" + }, + new + { + Id = 210, + Description = "Разрешение удалять Режимы бурения", + Name = "DrillParams.delete" + }, + new + { + Id = 211, + Description = "Разрешение редактировать Режимы бурения", + Name = "DrillParams.edit" + }, + new + { + Id = 212, + Description = "Разрешение просматривать Режимы бурения", + Name = "DrillParams.get" + }, + new + { + Id = 213, + Description = "Разрешение удалять Файлы", + Name = "File.delete" + }, + new + { + Id = 214, + Description = "Разрешение редактировать Файлы", + Name = "File.edit" + }, + new + { + Id = 215, + Description = "Разрешение просматривать Файлы", + Name = "File.get" + }, + new + { + Id = 216, + Description = "Разрешение удалять Измерения", + Name = "Measure.delete" + }, + new + { + Id = 217, + Description = "Разрешение редактировать Измерения", + Name = "Measure.edit" + }, + new + { + Id = 218, + Description = "Разрешение просматривать Измерения", + Name = "Measure.get" + }, + new + { + Id = 219, + Description = "Разрешение просматривать Сообщения телеметрии", + Name = "Message.get" + }, + new + { + Id = 220, + Description = "Разрешение просматривать Статистику по операциям", + Name = "OperationStat.get" + }, + new + { + Id = 221, + Description = "Разрешение редактировать Рапорта", + Name = "Report.edit" + }, + new + { + Id = 222, + Description = "Разрешение просматривать Рапорта", + Name = "Report.get" + }, + new + { + Id = 223, + Description = "Разрешение просматривать админ. Системная статистика", + Name = "RequestTracker.get" + }, + new + { + Id = 224, + Description = "Разрешение удалять Рекомендации уставок", + Name = "Setpoints.delete" + }, + new + { + Id = 225, + Description = "Разрешение редактировать Рекомендации уставок", + Name = "Setpoints.edit" + }, + new + { + Id = 226, + Description = "Разрешение просматривать Рекомендации уставок", + Name = "Setpoints.get" + }, + new + { + Id = 227, + Description = "Разрешение редактировать Телеметрии", + Name = "Telemetry.edit" + }, + new + { + Id = 228, + Description = "Разрешение просматривать Анализ телеметрии", + Name = "TelemetryAnalytics.get" + }, + new + { + Id = 229, + Description = "Разрешение редактировать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.edit" + }, + new + { + Id = 230, + Description = "Разрешение просматривать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.get" + }, + new + { + Id = 231, + Description = "Разрешение редактировать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.edit" + }, + new + { + Id = 232, + Description = "Разрешение просматривать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.get" + }, + new + { + Id = 233, + Description = "Разрешение редактировать Скважины", + Name = "Well.edit" + }, + new + { + Id = 234, + Description = "Разрешение просматривать Скважины", + Name = "Well.get" + }, + new + { + Id = 235, + Description = "Разрешение редактировать Композитные скважины", + Name = "WellComposite.edit" + }, + new + { + Id = 236, + Description = "Разрешение просматривать Композитные скважины", + Name = "WellComposite.get" + }, + new + { + Id = 237, + Description = "Разрешение удалять Операции по скважинам", + Name = "WellOperation.delete" + }, + new + { + Id = 238, + Description = "Разрешение редактировать Операции по скважинам", + Name = "WellOperation.edit" + }, + new + { + Id = 239, + Description = "Разрешение просматривать Операции по скважинам", + Name = "WellOperation.get" + }, + new + { + Id = 240, + Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", + Name = "File.edit1" + }, + new + { + Id = 241, + Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", + Name = "File.edit2" + }, + new + { + Id = 242, + Description = "Разрешение редактировать Файлы категории 3 (ННБ)", + Name = "File.edit3" + }, + new + { + Id = 243, + Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", + Name = "File.edit4" + }, + new + { + Id = 244, + Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", + Name = "File.edit5" + }, + new + { + Id = 245, + Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", + Name = "File.edit6" + }, + new + { + Id = 246, + Description = "Разрешение редактировать Файлы категории 7 (Мастер)", + Name = "File.edit7" + }, + new + { + Id = 247, + Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", + Name = "File.edit8" + }, + new + { + Id = 248, + Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", + Name = "File.edit9" + }, + new + { + Id = 249, + Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", + Name = "File.edit10" + }, + new + { + Id = 250, + Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", + Name = "File.edit11" + }, + new + { + Id = 251, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit12" + }, + new + { + Id = 252, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit13" + }, + new + { + Id = 253, + Description = "Разрешение редактировать Файлы категории 13", + Name = "File.edit14" + }, + new + { + Id = 254, + Description = "Разрешение редактировать Файлы категории 14", + Name = "File.edit15" + }, + new + { + Id = 255, + Description = "Разрешение редактировать Файлы категории 15", + Name = "File.edit16" + }, + new + { + Id = 256, + Description = "Разрешение редактировать Файлы категории 16", + Name = "File.edit17" + }, + new + { + Id = 257, + Description = "Разрешение редактировать Файлы категории 17", + Name = "File.edit18" + }, + new + { + Id = 258, + Description = "Разрешение редактировать Файлы категории 18", + Name = "File.edit19" + }, + new + { + Id = 259, + Description = "Разрешение редактировать Файлы категории 19", + Name = "File.edit20" + }, + new + { + Id = 260, + Description = "Разрешение редактировать Файлы категории 20", + Name = "File.edit21" + }, + new + { + Id = 261, + Description = "Разрешение редактировать Файлы категории 21", + Name = "File.edit22" + }, + new + { + Id = 262, + Description = "Разрешение редактировать Файлы категории 22", + Name = "File.edit23" + }, + new + { + Id = 263, + Description = "Разрешение редактировать Файлы категории 23", + Name = "File.edit24" + }, + new + { + Id = 264, + Description = "Разрешение редактировать Файлы категории 24", + Name = "File.edit25" + }, + new + { + Id = 265, + Description = "Разрешение редактировать Файлы категории 25", + Name = "File.edit26" + }, + new + { + Id = 266, + Description = "Разрешение редактировать Файлы категории 26", + Name = "File.edit27" + }, + new + { + Id = 267, + Description = "Разрешение редактировать Файлы категории 27", + Name = "File.edit28" + }, + new + { + Id = 268, + Description = "Разрешение редактировать Файлы категории 28", + Name = "File.edit29" + }, + new + { + Id = 269, + Description = "Разрешение редактировать Файлы категории 29", + Name = "File.edit30" + }, + new + { + Id = 380, + Description = "Разрешение просматривать список бурильщиков", + Name = "Driller.get" + }, + new + { + Id = 381, + Description = "Разрешение редактировать бурильщика", + Name = "Driller.edit" + }, + new + { + Id = 382, + Description = "Разрешение удалять бурильщик", + Name = "Driller.delete" + }, + new + { + Id = 383, + Description = "Разрешение просматривать графики бурильщиков", + Name = "Schedule.get" + }, + new + { + Id = 384, + Description = "Разрешение редактировать график бурильщика", + Name = "Schedule.edit" + }, + new + { + Id = 385, + Description = "Разрешение удалять график бурильщика", + Name = "Schedule.delete" + }, + new + { + Id = 386, + Description = "Разрешение просматривать суточный рапорт", + Name = "DailyReport.get" + }, + new + { + Id = 387, + Description = "Разрешение редактировать суточный рапорт", + Name = "DailyReport.edit" + }, + new + { + Id = 388, + Description = "Разрешение просматривать авто. определенные операции", + Name = "DetectedOperation.get" + }, + new + { + Id = 389, + Description = "Разрешение просматривать целевые значения", + Name = "OperationValue.get" + }, + new + { + Id = 390, + Description = "Разрешение редактировать целевые значения", + Name = "OperationValue.edit" + }, + new + { + Id = 391, + Description = "Разрешение удалять целевые значения", + Name = "OperationValue.delete" + }, + new + { + Id = 400, + Description = "Разрешение просматривать инфо по wits параметрам", + Name = "WitsInfo.get" + }, + new + { + Id = 401, + Description = "Разрешение просматривать WITS record 1", + Name = "WitsRecord1.get" + }, + new + { + Id = 407, + Description = "Разрешение просматривать WITS record 7", + Name = "WitsRecord7.get" + }, + new + { + Id = 408, + Description = "Разрешение просматривать WITS record 8", + Name = "WitsRecord8.get" + }, + new + { + Id = 450, + Description = "Разрешение просматривать WITS record 50", + Name = "WitsRecord50.get" + }, + new + { + Id = 460, + Description = "Разрешение просматривать WITS record 60", + Name = "WitsRecord60.get" + }, + new + { + Id = 461, + Description = "Разрешение просматривать WITS record 61", + Name = "WitsRecord61.get" + }, + new + { + Id = 500, + Description = "Разрешение удалять Категорий документов файлов", + Name = "FileCategory.delete" + }, + new + { + Id = 501, + Description = "Разрешение редактировать Категорий документов файлов", + Name = "FileCategory.edit" + }, + new + { + Id = 502, + Description = "Разрешение просматривать Категорий документов файлов", + Name = "FileCategory.get" + }, + new + { + Id = 503, + Description = "Разрешение удалять Дело скважины", + Name = "WellFinalDocuments.delete" + }, + new + { + Id = 504, + Description = "Разрешение редактировать Дело скважины", + Name = "WellFinalDocuments.edit" + }, + new + { + Id = 505, + Description = "Разрешение просматривать Дело скважины", + Name = "WellFinalDocuments.get" + }, + new + { + Id = 506, + Description = "Разрешение редактировать ответственных за загрузку файла Дело скважины", + Name = "WellFinalDocuments.editPublisher" + }, + new + { + Id = 507, + Description = "Разрешение просматривать наработка талевого каната", + Name = "TelemetryWirelineRunOut.get" + }, + new + { + Id = 510, + Description = "Разрешение просматривать плановая траектория", + Name = "PlannedTrajectory.get" + }, + new + { + Id = 511, + Description = "Разрешение редактировать плановая траектория", + Name = "PlannedTrajectory.edit" + }, + new + { + Id = 512, + Description = "Разрешение удалять плановая траектория", + Name = "PlannedTrajectory.delete" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PlannedTrajectory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AbsoluteMark") + .HasColumnType("double precision") + .HasColumnName("absolute_mark") + .HasComment("Абсолютная отметка"); + + b.Property("AngleIntensity") + .HasColumnType("double precision") + .HasColumnName("angle_intensity") + .HasComment("Интенсивность по углу"); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthIntensity") + .HasColumnType("double precision") + .HasColumnName("azimuth_intensity") + .HasComment("Интенсивность по азимуту"); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("EastCartographic") + .HasColumnType("double precision") + .HasColumnName("east_cartographic") + .HasComment("Восток картографический"); + + b.Property("EastOrifice") + .HasColumnType("double precision") + .HasColumnName("east_orifice") + .HasComment("Восток отн-но устья"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("NorthCartographic") + .HasColumnType("double precision") + .HasColumnName("north_cartographic") + .HasComment("Север картографический"); + + b.Property("NorthOrifice") + .HasColumnType("double precision") + .HasColumnName("north_orifice") + .HasComment("Север отн-но устья"); + + b.Property("OrificeOffset") + .HasColumnType("double precision") + .HasColumnName("orifice_offset") + .HasComment("Смещение от устья"); + + b.Property("SpatialIntensity") + .HasColumnType("double precision") + .HasColumnName("spatial_intensity") + .HasComment("Пространственная интенсивность"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_planned_trajectory"); + + b.HasComment("Загрузка плановой траектории"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMap", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AxialLoadFact") + .HasColumnType("double precision") + .HasColumnName("axial_load_fact") + .HasComment("Нагрузка, факт"); + + b.Property("AxialLoadPlan") + .HasColumnType("double precision") + .HasColumnName("axial_load_plan") + .HasComment("Нагрузка, план"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowFact") + .HasColumnType("double precision") + .HasColumnName("flow_fact") + .HasComment("Расход, факт"); + + b.Property("FlowPlan") + .HasColumnType("double precision") + .HasColumnName("flow_plan") + .HasComment("Расход, план"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureFact") + .HasColumnType("double precision") + .HasColumnName("pressure_fact") + .HasComment("Перепад давления, факт"); + + b.Property("PressurePlan") + .HasColumnType("double precision") + .HasColumnName("pressure_plan") + .HasComment("Перепад давления, план"); + + b.Property("RopPlan") + .HasColumnType("double precision") + .HasColumnName("rop_plan") + .HasComment("Плановая механическая скорость, м/ч"); + + b.Property("TopDriveSpeedFact") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_fact") + .HasComment("Обороты на ВСП, факт"); + + b.Property("TopDriveSpeedPlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_plan") + .HasComment("Обороты на ВСП, план"); + + b.Property("TopDriveTorqueFact") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_fact") + .HasComment("Момент на ВСП, факт"); + + b.Property("TopDriveTorquePlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_plan") + .HasComment("Момент на ВСП, план"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map"); + + 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.RelationUserDrillingProgramPart", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdDrillingProgramPart") + .HasColumnType("integer") + .HasColumnName("id_drilling_program_part"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_role") + .HasComment("1 - publisher, 2 - approver"); + + b.HasKey("IdUser", "IdDrillingProgramPart") + .HasName("t_relation_user_drilling_program_part_pk"); + + b.HasIndex("IdDrillingProgramPart"); + + b.ToTable("t_relation_user_drilling_program_part"); + + 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("Отношение ролей пользователей и разрешений доступа"); + + b.HasData( + new + { + IdUserRole = 1100, + IdPermission = 102 + }, + new + { + IdUserRole = 1100, + IdPermission = 111 + }, + new + { + IdUserRole = 1101, + IdPermission = 101 + }, + new + { + IdUserRole = 1101, + IdPermission = 100 + }, + new + { + IdUserRole = 1102, + IdPermission = 105 + }, + new + { + IdUserRole = 1102, + IdPermission = 108 + }, + new + { + IdUserRole = 1103, + IdPermission = 104 + }, + new + { + IdUserRole = 1103, + IdPermission = 103 + }, + new + { + IdUserRole = 1104, + IdPermission = 108 + }, + new + { + IdUserRole = 1105, + IdPermission = 107 + }, + new + { + IdUserRole = 1105, + IdPermission = 106 + }, + new + { + IdUserRole = 1106, + IdPermission = 111 + }, + new + { + IdUserRole = 1107, + IdPermission = 110 + }, + new + { + IdUserRole = 1107, + IdPermission = 109 + }, + new + { + IdUserRole = 1108, + IdPermission = 114 + }, + new + { + IdUserRole = 1109, + IdPermission = 113 + }, + new + { + IdUserRole = 1109, + IdPermission = 112 + }, + new + { + IdUserRole = 1110, + IdPermission = 123 + }, + new + { + IdUserRole = 1110, + IdPermission = 114 + }, + new + { + IdUserRole = 1111, + IdPermission = 122 + }, + new + { + IdUserRole = 1111, + IdPermission = 121 + }, + new + { + IdUserRole = 1112, + IdPermission = 117 + }, + new + { + IdUserRole = 1113, + IdPermission = 105 + }, + new + { + IdUserRole = 1113, + IdPermission = 123 + }, + new + { + IdUserRole = 1113, + IdPermission = 120 + }, + new + { + IdUserRole = 1114, + IdPermission = 119 + }, + new + { + IdUserRole = 1114, + IdPermission = 118 + }, + new + { + IdUserRole = 1114, + IdPermission = 200 + }, + new + { + IdUserRole = 1115, + IdPermission = 223 + }, + new + { + IdUserRole = 1116, + IdPermission = 105 + }, + new + { + IdUserRole = 1116, + IdPermission = 102 + }, + new + { + IdUserRole = 1116, + IdPermission = 117 + }, + new + { + IdUserRole = 1116, + IdPermission = 126 + }, + new + { + IdUserRole = 1117, + IdPermission = 125 + }, + new + { + IdUserRole = 1117, + IdPermission = 124 + }, + new + { + IdUserRole = 1200, + IdPermission = 203 + }, + new + { + IdUserRole = 1200, + IdPermission = 230 + }, + new + { + IdUserRole = 1201, + IdPermission = 202 + }, + new + { + IdUserRole = 1201, + IdPermission = 203 + }, + new + { + IdUserRole = 1201, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 203 + }, + new + { + IdUserRole = 1202, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 236 + }, + new + { + IdUserRole = 1202, + IdPermission = 212 + }, + new + { + IdUserRole = 1203, + IdPermission = 235 + }, + new + { + IdUserRole = 1204, + IdPermission = 202 + }, + new + { + IdUserRole = 1204, + IdPermission = 203 + }, + new + { + IdUserRole = 1205, + IdPermission = 215 + }, + new + { + IdUserRole = 1206, + IdPermission = 203 + }, + new + { + IdUserRole = 1206, + IdPermission = 206 + }, + new + { + IdUserRole = 1207, + IdPermission = 205 + }, + new + { + IdUserRole = 1208, + IdPermission = 218 + }, + new + { + IdUserRole = 1209, + IdPermission = 217 + }, + new + { + IdUserRole = 1210, + IdPermission = 203 + }, + new + { + IdUserRole = 1210, + IdPermission = 230 + }, + new + { + IdUserRole = 1210, + IdPermission = 219 + }, + new + { + IdUserRole = 1211, + IdPermission = 203 + }, + new + { + IdUserRole = 1211, + IdPermission = 220 + }, + new + { + IdUserRole = 1211, + IdPermission = 239 + }, + new + { + IdUserRole = 1212, + IdPermission = 238 + }, + new + { + IdUserRole = 1212, + IdPermission = 237 + }, + new + { + IdUserRole = 1213, + IdPermission = 203 + }, + new + { + IdUserRole = 1213, + IdPermission = 239 + }, + new + { + IdUserRole = 1213, + IdPermission = 212 + }, + new + { + IdUserRole = 1214, + IdPermission = 211 + }, + new + { + IdUserRole = 1214, + IdPermission = 210 + }, + new + { + IdUserRole = 1215, + IdPermission = 203 + }, + new + { + IdUserRole = 1215, + IdPermission = 222 + }, + new + { + IdUserRole = 1216, + IdPermission = 221 + }, + new + { + IdUserRole = 1217, + IdPermission = 226 + }, + new + { + IdUserRole = 1218, + IdPermission = 225 + }, + new + { + IdUserRole = 1218, + IdPermission = 224 + }, + new + { + IdUserRole = 1219, + IdPermission = 203 + }, + new + { + IdUserRole = 1219, + IdPermission = 206 + }, + new + { + IdUserRole = 1219, + IdPermission = 230 + }, + new + { + IdUserRole = 1219, + IdPermission = 232 + }, + new + { + IdUserRole = 1220, + IdPermission = 203 + }, + new + { + IdUserRole = 1220, + IdPermission = 228 + }, + new + { + IdUserRole = 1221, + IdPermission = 202 + }, + new + { + IdUserRole = 1221, + IdPermission = 203 + }, + new + { + IdUserRole = 1221, + IdPermission = 220 + }, + new + { + IdUserRole = 1221, + IdPermission = 234 + }, + new + { + IdUserRole = 1500, + IdPermission = 507 + }, + new + { + IdUserRole = 1500, + IdPermission = 510 + }, + new + { + IdUserRole = 1501, + IdPermission = 214 + }, + new + { + IdUserRole = 1501, + IdPermission = 213 + }, + new + { + IdUserRole = 1502, + IdPermission = 207 + }, + new + { + IdUserRole = 1502, + IdPermission = 208 + }, + new + { + IdUserRole = 2000, + IdPermission = 205 + }, + new + { + IdUserRole = 2000, + IdPermission = 204 + }, + new + { + IdUserRole = 2000, + IdPermission = 245 + }, + new + { + IdUserRole = 2001, + IdPermission = 244 + }, + new + { + IdUserRole = 2001, + IdPermission = 245 + }, + new + { + IdUserRole = 2002, + IdPermission = 244 + }, + new + { + IdUserRole = 2002, + IdPermission = 246 + }, + new + { + IdUserRole = 2002, + IdPermission = 237 + }, + new + { + IdUserRole = 2002, + IdPermission = 238 + }, + new + { + IdUserRole = 2003, + IdPermission = 240 + }, + new + { + IdUserRole = 2003, + IdPermission = 217 + }, + new + { + IdUserRole = 2003, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 242 + }, + new + { + IdUserRole = 2004, + IdPermission = 217 + }, + new + { + IdUserRole = 2004, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 205 + }, + new + { + IdUserRole = 2004, + IdPermission = 204 + }, + new + { + IdUserRole = 2005, + IdPermission = 247 + }, + new + { + IdUserRole = 2005, + IdPermission = 205 + }, + new + { + IdUserRole = 2005, + IdPermission = 204 + }, + new + { + IdUserRole = 2006, + IdPermission = 243 + }, + new + { + IdUserRole = 2006, + IdPermission = 205 + }, + new + { + IdUserRole = 2006, + IdPermission = 204 + }, + new + { + IdUserRole = 2007, + IdPermission = 241 + }, + new + { + IdUserRole = 2007, + IdPermission = 205 + }, + new + { + IdUserRole = 2007, + IdPermission = 204 + }, + new + { + IdUserRole = 1, + IdPermission = 500 + }, + new + { + IdUserRole = 1, + IdPermission = 501 + }, + new + { + IdUserRole = 1, + IdPermission = 502 + }, + new + { + IdUserRole = 1, + IdPermission = 503 + }, + new + { + IdUserRole = 1, + IdPermission = 504 + }, + new + { + IdUserRole = 1, + IdPermission = 505 + }, + new + { + IdUserRole = 1, + IdPermission = 506 + }, + new + { + IdUserRole = 1, + IdPermission = 510 + }, + new + { + IdUserRole = 1, + IdPermission = 511 + }, + new + { + IdUserRole = 1, + IdPermission = 512 + }); + }); + + 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("Отношение ролей к ролям"); + + b.HasData( + new + { + Id = 1101, + IdInclude = 1100 + }, + new + { + Id = 1103, + IdInclude = 1102 + }, + new + { + Id = 1105, + IdInclude = 1104 + }, + new + { + Id = 1107, + IdInclude = 1106 + }, + new + { + Id = 1109, + IdInclude = 1108 + }, + new + { + Id = 1111, + IdInclude = 1110 + }, + new + { + Id = 1114, + IdInclude = 1113 + }, + new + { + Id = 1117, + IdInclude = 1116 + }, + new + { + Id = 1203, + IdInclude = 1202 + }, + new + { + Id = 1207, + IdInclude = 1206 + }, + new + { + Id = 1209, + IdInclude = 1208 + }, + new + { + Id = 1212, + IdInclude = 1211 + }, + new + { + Id = 1214, + IdInclude = 1213 + }, + new + { + Id = 1216, + IdInclude = 1215 + }, + new + { + Id = 1218, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1200 + }, + new + { + Id = 2000, + IdInclude = 1201 + }, + new + { + Id = 2000, + IdInclude = 1202 + }, + new + { + Id = 2000, + IdInclude = 1204 + }, + new + { + Id = 2000, + IdInclude = 1205 + }, + new + { + Id = 2000, + IdInclude = 1206 + }, + new + { + Id = 2000, + IdInclude = 1208 + }, + new + { + Id = 2000, + IdInclude = 1210 + }, + new + { + Id = 2000, + IdInclude = 1211 + }, + new + { + Id = 2000, + IdInclude = 1213 + }, + new + { + Id = 2000, + IdInclude = 1215 + }, + new + { + Id = 2000, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1219 + }, + new + { + Id = 2000, + IdInclude = 1220 + }, + new + { + Id = 2000, + IdInclude = 1221 + }, + new + { + Id = 2000, + IdInclude = 1500 + }, + new + { + Id = 2000, + IdInclude = 1501 + }, + new + { + Id = 2000, + IdInclude = 1502 + }, + new + { + Id = 2001, + IdInclude = 1500 + }, + new + { + Id = 2001, + IdInclude = 1501 + }, + new + { + Id = 2001, + IdInclude = 1502 + }, + new + { + Id = 2002, + IdInclude = 1500 + }, + new + { + Id = 2002, + IdInclude = 1501 + }, + new + { + Id = 2002, + IdInclude = 1502 + }, + new + { + Id = 2003, + IdInclude = 1500 + }, + new + { + Id = 2003, + IdInclude = 1501 + }, + new + { + Id = 2003, + IdInclude = 1502 + }, + new + { + Id = 2004, + IdInclude = 1500 + }, + new + { + Id = 2004, + IdInclude = 1501 + }, + new + { + Id = 2004, + IdInclude = 1502 + }, + new + { + Id = 2005, + IdInclude = 1500 + }, + new + { + Id = 2005, + IdInclude = 1501 + }, + new + { + Id = 2005, + IdInclude = 1502 + }, + new + { + Id = 2006, + IdInclude = 1500 + }, + new + { + Id = 2006, + IdInclude = 1501 + }, + new + { + Id = 2006, + IdInclude = 1502 + }, + new + { + Id = 2007, + IdInclude = 1500 + }, + new + { + Id = 2007, + IdInclude = 1501 + }, + new + { + Id = 2007, + IdInclude = 1502 + }); + }); + + 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 = 1 + }); + }); + + 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.Schedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DrillEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_end") + .HasComment("Конец вахты"); + + b.Property("DrillStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_start") + .HasComment("Начало вахты"); + + b.Property("IdDriller") + .HasColumnType("integer") + .HasColumnName("id_driller") + .HasComment("Идентификатор бурильщика"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Идентификатор скважины"); + + b.Property("ShiftEnd") + .HasColumnType("time without time zone") + .HasColumnName("shift_end") + .HasComment("Конец смены"); + + b.Property("ShiftStart") + .HasColumnType("time without time zone") + .HasColumnName("shift_start") + .HasComment("Начало смены"); + + b.HasKey("Id"); + + b.HasIndex("IdDriller"); + + b.HasIndex("IdWell"); + + b.ToTable("t_schedule"); + + 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.Subsystems.Subsystem", 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"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_subsystem"); + + b.HasComment("Описание подсистем"); + + b.HasData( + new + { + Id = 1, + Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\"", + Name = "АКБ" + }, + new + { + Id = 2, + Description = "Алгоритм поиска оптимальных параметров бурения САУБ", + Name = "MSE" + }, + new + { + Id = 65536, + Description = "Spin master", + Name = "Spin master" + }, + new + { + Id = 65537, + Description = "Torque master", + Name = "Torque master" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("дата/время выключения подсистемы"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("дата/время включения подсистемы"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end") + .HasComment("глубина забоя на момент выключения подсистемы"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start") + .HasComment("глубина забоя на момент включения подсистемы"); + + b.Property("IdSubsystem") + .HasColumnType("integer") + .HasColumnName("id_subsystem"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("ИД телеметрии по которой выдается информация"); + + b.HasKey("Id"); + + b.HasIndex("IdSubsystem"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_subsystem_operation_time"); + + 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.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .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("Mse") + .HasColumnType("real") + .HasColumnName("mse") + .HasComment("MSE"); + + 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", "DateTime"); + + b.ToTable("t_telemetry_data_saub"); + + b.HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => + { + b.Property("Count") + .HasColumnType("bigint") + .HasColumnName("count_items"); + + b.Property("DateMax") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_max"); + + b.Property("DateMin") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_min"); + + b.Property("DepthMax") + .HasColumnType("real") + .HasColumnName("depth_max"); + + b.Property("DepthMin") + .HasColumnType("real") + .HasColumnName("depth_min"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.ToView("mw_telemetry_datas_saub_stat"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осцилляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .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("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.HasKey("IdTelemetry", "DateTime"); + + 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("DateTime") + .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.TelemetryWirelineRunOut", b => + { + b.Property("IdTelemetry") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("IdTelemetry")); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_time") + .HasComment("Отметка времени"); + + b.Property("Hauling") + .HasColumnType("real") + .HasColumnName("hauling") + .HasComment("Наработка талевого каната с момента перетяжки каната, т*км"); + + b.Property("HaulingWarnSp") + .HasColumnType("real") + .HasColumnName("hauling_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости перетяжки, т*км"); + + b.Property("Replace") + .HasColumnType("real") + .HasColumnName("replace") + .HasComment("Наработка талевого каната с момента замены каната, т*км"); + + b.Property("ReplaceWarnSp") + .HasColumnType("real") + .HasColumnName("replace_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости замены, т*км"); + + b.HasKey("IdTelemetry"); + + b.ToTable("t_telemetry_wireline_run_out"); + + 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 = "root", + IdType = 1 + }, + new + { + Id = 1100, + Caption = "admin_cluster.view", + IdType = 1 + }, + new + { + Id = 1101, + Caption = "admin_cluster.edit", + IdType = 1 + }, + new + { + Id = 1102, + Caption = "admin_company.view", + IdType = 1 + }, + new + { + Id = 1103, + Caption = "admin_company.edit", + IdType = 1 + }, + new + { + Id = 1104, + Caption = "admin_company_type.view", + IdType = 1 + }, + new + { + Id = 1105, + Caption = "admin_company_type.edit", + IdType = 1 + }, + new + { + Id = 1106, + Caption = "admin_deposit.view", + IdType = 1 + }, + new + { + Id = 1107, + Caption = "admin_deposit.edit", + IdType = 1 + }, + new + { + Id = 1108, + Caption = "admin_permission.view", + IdType = 1 + }, + new + { + Id = 1109, + Caption = "admin_permission.edit", + IdType = 1 + }, + new + { + Id = 1110, + Caption = "admin_role.view", + IdType = 1 + }, + new + { + Id = 1111, + Caption = "admin_role.edit", + IdType = 1 + }, + new + { + Id = 1112, + Caption = "admin_telemetry.view", + IdType = 1 + }, + new + { + Id = 1113, + Caption = "admin_user.view", + IdType = 1 + }, + new + { + Id = 1114, + Caption = "admin_user.edit", + IdType = 1 + }, + new + { + Id = 1115, + Caption = "admin_visit_log.view", + IdType = 1 + }, + new + { + Id = 1116, + Caption = "admin_well.view", + IdType = 1 + }, + new + { + Id = 1117, + Caption = "admin_well.edit", + IdType = 1 + }, + new + { + Id = 1200, + Caption = "archive.view", + IdType = 1 + }, + new + { + Id = 1201, + Caption = "cluster.view", + IdType = 1 + }, + new + { + Id = 1202, + Caption = "composite.view", + IdType = 1 + }, + new + { + Id = 1203, + Caption = "composite.edit", + IdType = 1 + }, + new + { + Id = 1204, + Caption = "deposit.view", + IdType = 1 + }, + new + { + Id = 1205, + Caption = "document.view", + IdType = 1 + }, + new + { + Id = 1206, + Caption = "drillProcessFlow.view", + IdType = 1 + }, + new + { + Id = 1207, + Caption = "drillProcessFlow.edit", + IdType = 1 + }, + new + { + Id = 1208, + Caption = "measure.view", + IdType = 1 + }, + new + { + Id = 1209, + Caption = "measure.edit", + IdType = 1 + }, + new + { + Id = 1210, + Caption = "message.view", + IdType = 1 + }, + new + { + Id = 1211, + Caption = "operations.view", + IdType = 1 + }, + new + { + Id = 1212, + Caption = "operations.edit", + IdType = 1 + }, + new + { + Id = 1213, + Caption = "params.view", + IdType = 1 + }, + new + { + Id = 1214, + Caption = "params.edit", + IdType = 1 + }, + new + { + Id = 1215, + Caption = "report.view", + IdType = 1 + }, + new + { + Id = 1216, + Caption = "report.edit", + IdType = 1 + }, + new + { + Id = 1217, + Caption = "setpoints.view", + IdType = 1 + }, + new + { + Id = 1218, + Caption = "setpoints.edit", + IdType = 1 + }, + new + { + Id = 1219, + Caption = "telemetry.view", + IdType = 1 + }, + new + { + Id = 1220, + Caption = "telemetryAnalysis.view", + IdType = 1 + }, + new + { + Id = 1221, + Caption = "well.view", + IdType = 1 + }, + new + { + Id = 1500, + Caption = "Просмотр всего", + IdType = 1 + }, + new + { + Id = 1501, + Caption = "file.edit", + IdType = 1 + }, + new + { + Id = 1502, + Caption = "drillingProgram.edit", + IdType = 1 + }, + new + { + Id = 2000, + Caption = "Заказчик", + IdType = 0 + }, + new + { + Id = 2001, + Caption = "Супервайзер", + IdType = 0 + }, + new + { + Id = 2002, + Caption = "Буровой подрядчик", + IdType = 0 + }, + new + { + Id = 2003, + Caption = "Растворщик", + IdType = 0 + }, + new + { + Id = 2004, + Caption = "Телеметрист", + IdType = 0 + }, + new + { + Id = 2005, + Caption = "Долотный сервис", + IdType = 0 + }, + new + { + Id = 2006, + Caption = "ГТИ", + IdType = 0 + }, + new + { + Id = 2007, + Caption = "Цементирование", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("key") + .HasComment("Ключ настроек пользователя"); + + b.Property("Value") + .HasColumnType("jsonb") + .HasColumnName("setting_value") + .HasComment("Значение настроек пользователя"); + + b.HasKey("IdUser", "Key"); + + b.ToTable("t_user_settings"); + + b.HasComment("настройки интерфейса пользователя"); + }); + + 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.WellFinalDocument", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.HasKey("IdWell", "IdUser", "IdCategory") + .HasName("t_well_final_documents_pk"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdUser"); + + b.ToTable("t_well_final_documents"); + + 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("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("id родительской категории"); + + b.Property("KeyValueName") + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("key_value_name") + .HasComment("Название ключевого показателя операции"); + + b.Property("KeyValueUnits") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("key_value_units") + .HasComment("Единицы измерения ключевого показателя операции"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.HasIndex("IdParent"); + + b.ToTable("t_well_operation_category"); + + b.HasComment("Справочник операций на скважине"); + + b.HasData( + new + { + Id = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "БУРЕНИЕ" + }, + new + { + Id = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КРЕПЛЕНИЕ" + }, + new + { + Id = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГФР" + }, + new + { + Id = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные операции" + }, + new + { + Id = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Непроизводительное время (НПВ)" + }, + new + { + Id = 4000, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КНБК" + }, + new + { + Id = 4001, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "Механическое. бурение" + }, + new + { + Id = 4002, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Статический замер" + }, + new + { + Id = 4003, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Нормализация диаметра скважины" + }, + new + { + Id = 4004, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 4005, + IdParent = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4006, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск обсадной колонны" + }, + new + { + Id = 4007, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 4008, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы при креплении" + }, + new + { + Id = 4009, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка/разборка приборов ГИС" + }, + new + { + Id = 4010, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4011, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГИС" + }, + new + { + Id = 4012, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка, ОБР" + }, + new + { + Id = 4013, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы" + }, + new + { + Id = 4014, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт оборудования" + }, + new + { + Id = 4015, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Аварийные работы" + }, + new + { + Id = 4016, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Осложнение" + }, + new + { + Id = 4017, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Незаложенные в ГГД операции" + }, + new + { + Id = 5000, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка КНБК" + }, + new + { + Id = 5001, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка КНБК" + }, + new + { + Id = 5002, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Направленно (СЛАЙД)" + }, + new + { + Id = 5003, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Ротором (РУС)" + }, + new + { + Id = 5004, + IdParent = 4002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Замер ЗТС (запись MWD)" + }, + new + { + Id = 5005, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка перед наращиванием" + }, + new + { + Id = 5006, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка во время бурения" + }, + new + { + Id = 5007, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка перед наращиванием" + }, + new + { + Id = 5008, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка во время бурения" + }, + new + { + Id = 5009, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка перед наращиванием" + }, + new + { + Id = 5010, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 5011, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Удержание в клиньях" + }, + new + { + Id = 5012, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем инструмента" + }, + new + { + Id = 5013, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем КНБК" + }, + new + { + Id = 5014, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента" + }, + new + { + Id = 5015, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск КНБК" + }, + new + { + Id = 5016, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка при спуске ОК" + }, + new + { + Id = 5017, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск ОК" + }, + new + { + Id = 5018, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ОЗЦ" + }, + new + { + Id = 5019, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 5020, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка БИ" + }, + new + { + Id = 5021, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ОК" + }, + new + { + Id = 5022, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при спуске ОК" + }, + new + { + Id = 5023, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при цементировании" + }, + new + { + Id = 5024, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка комплекса приборов ГИС" + }, + new + { + Id = 5025, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка комплекса приборов ГИС" + }, + new + { + Id = 5026, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем приборов ГИС (на трубах)" + }, + new + { + Id = 5027, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск приборов ГИС (на трубах)" + }, + new + { + Id = 5028, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на жестком кабеле" + }, + new + { + Id = 5029, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на кабеле" + }, + new + { + Id = 5030, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на трубах" + }, + new + { + Id = 5031, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Закачка/прокачка пачки" + }, + new + { + Id = 5032, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка БР" + }, + new + { + Id = 5033, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование ТС при бурении" + }, + new + { + Id = 5034, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перезапись гаммы-каротажа" + }, + new + { + Id = 5035, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Приготовление БР" + }, + new + { + Id = 5036, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка" + }, + new + { + Id = 5037, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 5038, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента с проработкой" + }, + new + { + Id = 5039, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ВМР" + }, + new + { + Id = 5040, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Демонтаж ПВО" + }, + new + { + Id = 5041, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Долив затруба при подъёме" + }, + new + { + Id = 5042, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Монтаж ПВО" + }, + new + { + Id = 5043, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наработка жёлоба" + }, + new + { + Id = 5044, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обвязка устья с циркуляционной системой" + }, + new + { + Id = 5045, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Оборудование устья" + }, + new + { + Id = 5046, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ПВО" + }, + new + { + Id = 5047, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перемонтаж ПВО " + }, + new + { + Id = 5048, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перетяжка талевого каната" + }, + new + { + Id = 5049, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при сборке КНБК" + }, + new + { + Id = 5050, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Полная замена талевого каната" + }, + new + { + Id = 5051, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПР перед забуркой направления" + }, + new + { + Id = 5052, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Продувка манифольда" + }, + new + { + Id = 5053, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Срезка" + }, + new + { + Id = 5054, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тайм-дриллинг" + }, + new + { + Id = 5055, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тех.отстой" + }, + new + { + Id = 5056, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Учебная тревога \"Выброс\"" + }, + new + { + Id = 5057, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Чистка ЦСГО/емкостного блока" + }, + new + { + Id = 5058, + IdParent = 4014, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт бурового оборудования" + }, + new + { + Id = 5059, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ловильные работы" + }, + new + { + Id = 5060, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ожидание" + }, + new + { + Id = 5061, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Определение места прихвата и ЛМ" + }, + new + { + Id = 5062, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа яссом" + }, + new + { + Id = 5063, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Расхаживание" + }, + new + { + Id = 5064, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - колокол" + }, + new + { + Id = 5065, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - метчик" + }, + new + { + Id = 5066, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - овершот" + }, + new + { + Id = 5067, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - труболовка" + }, + new + { + Id = 5068, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (встряхивание)" + }, + new + { + Id = 5069, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (отстрел)" + }, + new + { + Id = 5070, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Установка ванн" + }, + new + { + Id = 5071, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Фрезеровка" + }, + new + { + Id = 5072, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Контролируемое ГНВП" + }, + new + { + Id = 5073, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Поглощение" + }, + new + { + Id = 5074, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сальникообразование" + }, + new + { + Id = 5075, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Утяжеление БР" + }, + new + { + Id = 5076, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "НПВ / прочее" + }, + new + { + Id = 5077, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка раствора (несоответствие параметров)" + }, + new + { + Id = 5078, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "подъем ОК" + }, + new + { + Id = 5079, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ревизия КНБК/инструмента/ЗТС" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .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" + }, + new + { + Id = 31, + Caption = "Техническая колонна" + }, + new + { + Id = 32, + Caption = "Техническая колонна 2" + }, + new + { + Id = 33, + Caption = "Техническая колонна 3" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .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.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Blkpos") + .HasColumnType("real") + .HasColumnName("BLKPOS"); + + b.Property("Chkp") + .HasColumnType("real") + .HasColumnName("CHKP"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptretm") + .HasColumnType("real") + .HasColumnName("DEPTRETM"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Gasa") + .HasColumnType("real") + .HasColumnName("GASA"); + + b.Property("Hkla") + .HasColumnType("real") + .HasColumnName("HKLA"); + + b.Property("Hklx") + .HasColumnType("real") + .HasColumnName("HKLX"); + + b.Property("Lagstks") + .HasColumnType("smallint") + .HasColumnName("LAGSTKS"); + + b.Property("Mcia") + .HasColumnType("real") + .HasColumnName("MCIA"); + + b.Property("Mcoa") + .HasColumnType("real") + .HasColumnName("MCOA"); + + b.Property("Mdia") + .HasColumnType("real") + .HasColumnName("MDIA"); + + b.Property("Mdoa") + .HasColumnType("real") + .HasColumnName("MDOA"); + + b.Property("Mfia") + .HasColumnType("real") + .HasColumnName("MFIA"); + + b.Property("Mfoa") + .HasColumnType("real") + .HasColumnName("MFOA"); + + b.Property("Mfop") + .HasColumnType("smallint") + .HasColumnName("MFOP"); + + b.Property("Mtia") + .HasColumnType("real") + .HasColumnName("MTIA"); + + b.Property("Mtoa") + .HasColumnType("real") + .HasColumnName("MTOA"); + + b.Property("Ropa") + .HasColumnType("real") + .HasColumnName("ROPA"); + + b.Property("Rpma") + .HasColumnType("smallint") + .HasColumnName("RPMA"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spm1") + .HasColumnType("smallint") + .HasColumnName("SPM1"); + + b.Property("Spm2") + .HasColumnType("smallint") + .HasColumnName("SPM2"); + + b.Property("Spm3") + .HasColumnType("smallint") + .HasColumnName("SPM3"); + + b.Property("Sppa") + .HasColumnType("real") + .HasColumnName("SPPA"); + + b.Property("Stkc") + .HasColumnType("integer") + .HasColumnName("STKC"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.Property("Torqa") + .HasColumnType("real") + .HasColumnName("TORQA"); + + b.Property("Torqx") + .HasColumnType("real") + .HasColumnName("TORQX"); + + b.Property("Tvolact") + .HasColumnType("real") + .HasColumnName("TVOLACT"); + + b.Property("Tvolcact") + .HasColumnType("real") + .HasColumnName("TVOLCACT"); + + b.Property("Woba") + .HasColumnType("real") + .HasColumnName("WOBA"); + + b.Property("Wobx") + .HasColumnType("real") + .HasColumnName("WOBX"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_1"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("DeptmeasGdpMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_GDP_mc"); + + b.Property("DeptmeasMcrstat") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_MCRSTAT"); + + b.Property("DeptmeasRa33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33_mc"); + + b.Property("DeptmeasRa33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F2_mc"); + + b.Property("DeptmeasRa33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F4_mc"); + + b.Property("DeptmeasRp33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33_mc"); + + b.Property("DeptmeasRp33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F2_mc"); + + b.Property("DeptmeasRp33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F4_mc"); + + b.Property("DeptmeasSlvlMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_SLVL_mc"); + + b.Property("GdpMc") + .HasColumnType("real") + .HasColumnName("GDP_mc"); + + b.Property("Mcrstat") + .HasColumnType("real") + .HasColumnName("MCRSTAT"); + + b.Property("Ra33Mc") + .HasColumnType("real") + .HasColumnName("RA33_mc"); + + b.Property("Ra33f2Mc") + .HasColumnType("real") + .HasColumnName("RA33F2_mc"); + + b.Property("Ra33f4Mc") + .HasColumnType("real") + .HasColumnName("RA33F4_mc"); + + b.Property("Rp33Mc") + .HasColumnType("real") + .HasColumnName("RP33_mc"); + + b.Property("Rp33f2Mc") + .HasColumnType("real") + .HasColumnName("RP33F2_mc"); + + b.Property("Rp33f4Mc") + .HasColumnType("real") + .HasColumnName("RP33F4_mc"); + + b.Property("SlvlMc") + .HasColumnType("real") + .HasColumnName("SLVL_mc"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_50"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Btot") + .HasColumnType("real") + .HasColumnName("Btot"); + + b.Property("Bx") + .HasColumnType("real") + .HasColumnName("Bx"); + + b.Property("By") + .HasColumnType("real") + .HasColumnName("By"); + + b.Property("Bz") + .HasColumnType("real") + .HasColumnName("Bz"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Gtot") + .HasColumnType("real") + .HasColumnName("Gtot"); + + b.Property("Gx") + .HasColumnType("real") + .HasColumnName("Gx"); + + b.Property("Gy") + .HasColumnType("real") + .HasColumnName("Gy"); + + b.Property("Gz") + .HasColumnType("real") + .HasColumnName("Gz"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_60"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Att06h") + .HasColumnType("real") + .HasColumnName("ATT06H"); + + b.Property("Att06l") + .HasColumnType("real") + .HasColumnName("ATT06L"); + + b.Property("Att10h") + .HasColumnType("real") + .HasColumnName("ATT10H"); + + b.Property("Att10l") + .HasColumnType("real") + .HasColumnName("ATT10L"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Phl1f1") + .HasColumnType("real") + .HasColumnName("PHL1F1"); + + b.Property("Phl1f2") + .HasColumnType("real") + .HasColumnName("PHL1F2"); + + b.Property("Phl2f1") + .HasColumnType("real") + .HasColumnName("PHL2F1"); + + b.Property("Phl2f2") + .HasColumnType("real") + .HasColumnName("PHL2F2"); + + b.Property("Status") + .HasColumnType("real") + .HasColumnName("Status"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_61"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptsvym") + .HasColumnType("real") + .HasColumnName("DEPTSVYM"); + + b.Property("Deptsvyv") + .HasColumnType("real") + .HasColumnName("DEPTSVYV"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Svyazc") + .HasColumnType("real") + .HasColumnName("SVYAZC"); + + b.Property("Svyazu") + .HasColumnType("real") + .HasColumnName("SVYAZU"); + + b.Property("Svydls") + .HasColumnType("real") + .HasColumnName("SVYDLS"); + + b.Property("Svyew") + .HasColumnType("real") + .HasColumnName("SVYEW"); + + b.Property("Svygtf") + .HasColumnType("real") + .HasColumnName("SVYGTF"); + + b.Property("Svyinc") + .HasColumnType("real") + .HasColumnName("SVYINC"); + + b.Property("Svymtf") + .HasColumnType("real") + .HasColumnName("SVYMTF"); + + b.Property("Svyns") + .HasColumnType("real") + .HasColumnName("SVYNS"); + + b.Property("Svytype") + .HasColumnType("text") + .HasColumnName("SVYTYPE"); + + b.Property("Svywalk") + .HasColumnType("real") + .HasColumnName("SVYWALK"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_7"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptcalm") + .HasColumnType("real") + .HasColumnName("DEPTCALM"); + + b.Property("Deptcalv") + .HasColumnType("real") + .HasColumnName("DEPTCALV"); + + b.Property("Deptfdm") + .HasColumnType("real") + .HasColumnName("DEPTFDM"); + + b.Property("Deptfdv") + .HasColumnType("real") + .HasColumnName("DEPTFDV"); + + b.Property("Deptgr1m") + .HasColumnType("real") + .HasColumnName("DEPTGR1M"); + + b.Property("Deptgr1v") + .HasColumnType("real") + .HasColumnName("DEPTGR1V"); + + b.Property("Deptgr2m") + .HasColumnType("real") + .HasColumnName("DEPTGR2M"); + + b.Property("Deptgr2v") + .HasColumnType("real") + .HasColumnName("DEPTGR2V"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptp1m") + .HasColumnType("real") + .HasColumnName("DEPTP1M"); + + b.Property("Deptp1v") + .HasColumnType("real") + .HasColumnName("DEPTP1V"); + + b.Property("Deptp2m") + .HasColumnType("real") + .HasColumnName("DEPTP2M"); + + b.Property("Deptp2v") + .HasColumnType("real") + .HasColumnName("DEPTP2V"); + + b.Property("Deptrs1m") + .HasColumnType("real") + .HasColumnName("DEPTRS1M"); + + b.Property("Deptrs1v") + .HasColumnType("real") + .HasColumnName("DEPTRS1V"); + + b.Property("Deptrs2m") + .HasColumnType("real") + .HasColumnName("DEPTRS2M"); + + b.Property("Deptrs2v") + .HasColumnType("real") + .HasColumnName("DEPTRS2V"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Mclp") + .HasColumnType("real") + .HasColumnName("MCLP"); + + b.Property("Mfd") + .HasColumnType("real") + .HasColumnName("MFD"); + + b.Property("Mffp") + .HasColumnType("real") + .HasColumnName("MFFP"); + + b.Property("Mfpp") + .HasColumnType("real") + .HasColumnName("MFPP"); + + b.Property("Mfrann") + .HasColumnType("real") + .HasColumnName("MFRANN"); + + b.Property("Mfrpipe") + .HasColumnType("real") + .HasColumnName("MFRPIPE"); + + b.Property("Mftann") + .HasColumnType("real") + .HasColumnName("MFTANN"); + + b.Property("Mftpipe") + .HasColumnType("real") + .HasColumnName("MFTPIPE"); + + b.Property("Mg1") + .HasColumnType("real") + .HasColumnName("MG1"); + + b.Property("Mg1c") + .HasColumnType("real") + .HasColumnName("MG1C"); + + b.Property("Mg2") + .HasColumnType("real") + .HasColumnName("MG2"); + + b.Property("Mg2c") + .HasColumnType("real") + .HasColumnName("MG2C"); + + b.Property("Mpo1") + .HasColumnType("real") + .HasColumnName("MPO1"); + + b.Property("Mpo2") + .HasColumnType("real") + .HasColumnName("MPO2"); + + b.Property("Mr1") + .HasColumnType("real") + .HasColumnName("MR1"); + + b.Property("Mr1c") + .HasColumnType("real") + .HasColumnName("MR1C"); + + b.Property("Mr2") + .HasColumnType("real") + .HasColumnName("MR2"); + + b.Property("Mr2c") + .HasColumnType("real") + .HasColumnName("MR2C"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spare6") + .HasColumnType("real") + .HasColumnName("SPARE6"); + + b.Property("Spare7") + .HasColumnType("real") + .HasColumnName("SPARE7"); + + b.Property("Spare8") + .HasColumnType("real") + .HasColumnName("SPARE8"); + + b.Property("Spare9") + .HasColumnType("real") + .HasColumnName("SPARE9"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_8"); + }); + + 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.DailyReport.DailyReport", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdFileCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("DrillingProgramParts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + 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.LimitingParameter", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + 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.OperationValue", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdOperationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PlannedTrajectory", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMap", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + 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.RelationUserDrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.DrillingProgramPart", "DrillingProgramPart") + .WithMany("RelatedUsers") + .HasForeignKey("IdDrillingProgramPart") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DrillingProgramPart"); + + b.Navigation("User"); + }); + + 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.Schedule", b => + { + b.HasOne("AsbCloudDb.Model.Driller", "Driller") + .WithMany("Schedule") + .HasForeignKey("IdDriller") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_schedule_t_driller_id_driller"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Driller"); + + 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.Subsystems.SubsystemOperationTime", b => + { + b.HasOne("AsbCloudDb.Model.Subsystems.Subsystem", "Subsystem") + .WithMany() + .HasForeignKey("IdSubsystem") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subsystem"); + + 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.UserSetting", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + 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.WellFinalDocument", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "Category") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + 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.WellOperationCategory", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Parent") + .WithMany() + .HasForeignKey("IdParent"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + 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.Driller", b => + { + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Navigation("RelatedUsers"); + }); + + 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("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("DrillingProgramParts"); + + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + 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/20230124100243_Fix_PlannedTrajectory_permissions.cs b/AsbCloudDb/Migrations/20230124100243_Fix_PlannedTrajectory_permissions.cs new file mode 100644 index 00000000..94a7bbc8 --- /dev/null +++ b/AsbCloudDb/Migrations/20230124100243_Fix_PlannedTrajectory_permissions.cs @@ -0,0 +1,57 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Fix_PlannedTrajectory_permissions : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_permission", + keyColumn: "id", + keyValue: 510, + column: "name", + value: "PlannedTrajectory.get"); + + migrationBuilder.UpdateData( + table: "t_permission", + keyColumn: "id", + keyValue: 511, + column: "name", + value: "PlannedTrajectory.edit"); + + migrationBuilder.UpdateData( + table: "t_permission", + keyColumn: "id", + keyValue: 512, + column: "name", + value: "PlannedTrajectory.delete"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.UpdateData( + table: "t_permission", + keyColumn: "id", + keyValue: 510, + column: "name", + value: "TelemetryWirelineRunOut.get"); + + migrationBuilder.UpdateData( + table: "t_permission", + keyColumn: "id", + keyValue: 511, + column: "name", + value: "TelemetryWirelineRunOut.edit"); + + migrationBuilder.UpdateData( + table: "t_permission", + keyColumn: "id", + keyValue: 512, + column: "name", + value: "TelemetryWirelineRunOut.delete"); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 1cd03876..22ff1833 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -1770,19 +1770,19 @@ namespace AsbCloudDb.Migrations { Id = 510, Description = "Разрешение просматривать плановая траектория", - Name = "TelemetryWirelineRunOut.get" + Name = "PlannedTrajectory.get" }, new { Id = 511, Description = "Разрешение редактировать плановая траектория", - Name = "TelemetryWirelineRunOut.edit" + Name = "PlannedTrajectory.edit" }, new { Id = 512, Description = "Разрешение удалять плановая траектория", - Name = "TelemetryWirelineRunOut.delete" + Name = "PlannedTrajectory.delete" }); }); diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs index ff7ca9c1..9c259dae 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs @@ -138,9 +138,9 @@ new (){ Id = 507, Name="TelemetryWirelineRunOut.get", Description="Разрешение просматривать наработка талевого каната"}, - new (){ Id = 510, Name="TelemetryWirelineRunOut.get", Description="Разрешение просматривать плановая траектория"}, - new (){ Id = 511, Name="TelemetryWirelineRunOut.edit", Description="Разрешение редактировать плановая траектория"}, - new (){ Id = 512, Name="TelemetryWirelineRunOut.delete", Description="Разрешение удалять плановая траектория"}, + new (){ Id = 510, Name="PlannedTrajectory.get", Description="Разрешение просматривать плановая траектория"}, + new (){ Id = 511, Name="PlannedTrajectory.edit", Description="Разрешение редактировать плановая траектория"}, + new (){ Id = 512, Name="PlannedTrajectory.delete", Description="Разрешение удалять плановая траектория"}, }; } } From 05c238737da406985dd21e623548fd4a62f3e30c Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Tue, 24 Jan 2023 15:21:49 +0500 Subject: [PATCH 13/29] fix SubsystemOperationTimeService. WelOperationCategories use valid constants. --- .../Services/Subsystems/SubsystemOperationTimeService.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index 16a48b56..a5ed9e49 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -94,8 +94,8 @@ namespace AsbCloudInfrastructure.Services.Subsystems var detectedOperationsRequest = new DetectedOperationRequest() { IdWell = request.IdWell, - IdsCategories = new List() { - 1,3 + IdsCategories = new int[] { + WellOperationCategory.IdRotor, WellOperationCategory.IdSlide, }, LtDate = request.LtDate, GtDate = request.GtDate, @@ -158,9 +158,9 @@ namespace AsbCloudInfrastructure.Services.Subsystems } private static (double depthIntervalRotor, double depthIntervalSlide) GetDepthInterval (IEnumerable detectedOperations) { - var depthIntervalRotor = detectedOperations.Where(o => o.IdCategory == 1) + var depthIntervalRotor = detectedOperations.Where(o => o.IdCategory == WellOperationCategory.IdRotor) .Sum(o => o.DepthEnd - o.DepthStart); - var depthIntervalSlide = detectedOperations.Where(o => o.IdCategory == 3) + var depthIntervalSlide = detectedOperations.Where(o => o.IdCategory == WellOperationCategory.IdSlide) .Sum(o => o.DepthEnd - o.DepthStart); var depthInterval = (depthIntervalRotor, depthIntervalSlide); From 907fcc88e8dc369b61e1b20bb7c27fcb7adb2f2c Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 25 Jan 2023 05:32:32 +0500 Subject: [PATCH 14/29] -refact path convert file --- .../DrillingProgram/Convert/ConvertToPdf.cs | 33 ++++++++----------- .../DrillingProgram/DrillingProgramService.cs | 7 ++-- .../Controllers/DrillingProgramController.cs | 8 +---- 3 files changed, 19 insertions(+), 29 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index 89e63335..880df0f8 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -33,45 +33,40 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert }; } - private static async Task StartConvertProcessAsync(string inputFileName, string outFileName, CancellationToken token) + private static async Task StartConvertProcessAsync(string inputFileName, string resultFileDir,CancellationToken token) { //var result = Cli.Wrap("/usr/bin/soffice") // .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"); - var result = Cli.Wrap("C:\\Program Files\\LibreOffice\\program\\soffice.exe") - .WithArguments($"-headless -convert-to pdf {inputFileName} --outdir {outFileName}"); - await result.ExecuteAsync(token); + var command = Cli.Wrap("C:\\Program Files\\LibreOffice\\program\\soffice.exe") + .WithArguments($"-headless -convert-to pdf {inputFileName} --outdir {resultFileDir}"); + await command.ExecuteAsync(token); } - public static async Task GetConverteAndMergedFileAsync(IEnumerable filesNames, string resultPath, CancellationToken token) + public static async Task GetConverteAndMergedFileAsync(IEnumerable files, string resultPath, string convertedFilesDir,CancellationToken token) { - var badFiles = filesNames.Where(f => !filesExtensions.Contains(Path.GetExtension(f))); + var badFiles = files.Where(f => !filesExtensions.Contains(Path.GetExtension(f))); if (badFiles.Any()) { throw new FileFormatException($"Файлы: {string.Join(", ", badFiles)} - неподдерживаемого формата. " + $"Они не могут быть добавлены в список файлов для конвертации и слияния в общий файл программы бурения."); } - var listFileNames = filesNames + var listFiles = files .Distinct() .Select(f => new { inputFile = f, - convertedFile = Path.ChangeExtension(f, ".pdf") + convertedFile = Path.Combine(convertedFilesDir,"pdf",Path.ChangeExtension(Path.GetFileName(f), ".pdf")) }) .ToList(); - var listFilesToDelete = new List(); - foreach (var fileName in listFileNames) - { - var fileExt = Path.GetExtension(fileName.inputFile); + foreach (var file in listFiles) + { + var fileExt = Path.GetExtension(file.inputFile); if (fileExt != ".pdf") { - await StartConvertProcessAsync(fileName.inputFile, fileName.convertedFile, token); - listFilesToDelete.Add(fileName.convertedFile); + await StartConvertProcessAsync(file.inputFile, Path.GetDirectoryName(file.convertedFile)!,token); } } - MergeFiles(listFileNames.Select(c => c.convertedFile), resultPath); - foreach (var file in listFilesToDelete) - { - File.Delete(file); - } + MergeFiles(listFiles.Select(c => c.convertedFile), resultPath); + Directory.Delete(Path.Combine(convertedFilesDir,"pdf"),true); } } #nullable disable diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index c27dfb2d..531da7d3 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -477,14 +477,15 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram if (!backgroundWorker.Contains(workId)) { var well = (await wellService.GetOrDefaultAsync(idWell, token))!; - var resultFileName = $"Программа бурения {well.Cluster} {well.Caption}.xlsx"; - var tempResultFilePath = Path.Combine(Path.GetTempPath(), "drillingProgram", resultFileName); + var resultFileName = $"Программа бурения {well.Cluster} {well.Caption}.pdf"; + var convertedFilesDir = Path.Combine(Path.GetTempPath(), "drillingProgram", $"{well.Cluster}_{well.Caption}"); + var tempResultFilePath = Path.Combine(convertedFilesDir, resultFileName); var workAction = async (string workId, IServiceProvider serviceProvider, CancellationToken token) => { var context = serviceProvider.GetRequiredService(); var fileService = serviceProvider.GetRequiredService(); var files = state.Parts.Select(p => fileService.GetUrl(p.File)); - await ConvertToPdf.GetConverteAndMergedFileAsync(files, tempResultFilePath, token); + await ConvertToPdf.GetConverteAndMergedFileAsync(files, tempResultFilePath, convertedFilesDir, token); await fileService.MoveAsync(idWell, null, idFileCategoryDrillingProgram, resultFileName, tempResultFilePath, token); }; diff --git a/AsbCloudWebApi/Controllers/DrillingProgramController.cs b/AsbCloudWebApi/Controllers/DrillingProgramController.cs index 2be612bd..fc4eeb11 100644 --- a/AsbCloudWebApi/Controllers/DrillingProgramController.cs +++ b/AsbCloudWebApi/Controllers/DrillingProgramController.cs @@ -125,13 +125,7 @@ namespace AsbCloudWebApi.Controllers return BadRequest(ArgumentInvalidException.MakeValidationError(nameof(files), "at list 1 file should be uploaded")); var fileName = files[0].FileName; - - // TODO: в текущем контексте доработки по ковертации - // данная проверка будет некорректна, т.к. планируется загружать - // файлы разных форматов - //if (!fileName.EndsWith(".xlsx")) - // return BadRequest(ArgumentInvalidException.MakeValidationError("file", "Файл должен быть xlsx")); - + var fileStream = files[0].OpenReadStream(); var result = await drillingProgramService.AddFile(idWell, idFileCategory, (int)idUser, fileName, fileStream, token); From 325c5054fe5f1d09cf442d94659d2478861da33a Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 25 Jan 2023 05:41:29 +0500 Subject: [PATCH 15/29] cleaning up unnecessary dependencies --- .../Services/DrillingProgram/DrillingProgramService.cs | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index 531da7d3..5083237e 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -29,8 +29,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram private readonly IWellService wellService; private readonly IConfiguration configuration; private readonly BackgroundWorker backgroundWorker; - private readonly IEmailService emailService; - private readonly IServiceProvider serviceProvider; + private readonly IEmailService emailService; private const int idFileCategoryDrillingProgram = 1000; private const int idFileCategoryDrillingProgramPartsStart = 1001; @@ -59,8 +58,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram IWellService wellService, IConfiguration configuration, BackgroundWorker backgroundWorker, - IEmailService emailService, - IServiceProvider serviceProvider) + IEmailService emailService) { this.context = context; this.fileService = fileService; @@ -69,8 +67,6 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram this.configuration = configuration; this.backgroundWorker = backgroundWorker; this.emailService = emailService; - this.serviceProvider = serviceProvider; - } public async Task> GetAvailableUsers(int idWell, CancellationToken token = default) From b7f1962c6f300347cd62252cbbcec22d9e62bee7 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 26 Jan 2023 15:25:09 +0500 Subject: [PATCH 16/29] valid file extension --- .../DrillingProgram/DrillingProgramService.cs | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index 5083237e..32773c5d 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -51,6 +51,8 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram private const int idStateReady = 3; private const int idStateError = 4; + private static readonly string[] filePermittedExt = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + public DrillingProgramService( IAsbCloudDbContext context, FileService fileService, @@ -161,13 +163,23 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram await EnqueueMakeProgramWorkAsync(idWell, state, token); return state; } - + private bool ValidExtFile(string file) + { + var fileExt = Path.GetExtension(file); + var badExt = Array.Find(filePermittedExt, e => e == fileExt); + if (badExt is null) + return false; + return true; + } public async Task AddFile(int idWell, int idFileCategory, int idUser, string fileFullName, System.IO.Stream fileStream, CancellationToken token = default) { + if (!ValidExtFile(fileFullName)) + throw new FileFormatException($"Файл {fileFullName} - неподдерживаемого формата. Файл не может быть загружен. "); + var part = await context.DrillingProgramParts - .Include(p => p.RelatedUsers) - .ThenInclude(r => r.User) - .FirstOrDefaultAsync(p => p.IdWell == idWell && p.IdFileCategory == idFileCategory, token); + .Include(p => p.RelatedUsers) + .ThenInclude(r => r.User) + .FirstOrDefaultAsync(p => p.IdWell == idWell && p.IdFileCategory == idFileCategory, token); if (part == null) throw new ArgumentInvalidException($"DrillingProgramPart id == {idFileCategory} does not exist", nameof(idFileCategory)); @@ -465,6 +477,8 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram return part; } + + private async Task EnqueueMakeProgramWorkAsync(int idWell, DrillingProgramStateDto state, CancellationToken token) { if (state.IdState == idStateCreating) From f0d316cf4011033a156cbd5390ead38972ec2532 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 26 Jan 2023 15:28:19 +0500 Subject: [PATCH 17/29] refact convert process command --- .../Services/DrillingProgram/Convert/ConvertToPdf.cs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index 880df0f8..4c659e41 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -34,11 +34,9 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert } private static async Task StartConvertProcessAsync(string inputFileName, string resultFileDir,CancellationToken token) - { - //var result = Cli.Wrap("/usr/bin/soffice") - // .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {outFileName}"); - var command = Cli.Wrap("C:\\Program Files\\LibreOffice\\program\\soffice.exe") - .WithArguments($"-headless -convert-to pdf {inputFileName} --outdir {resultFileDir}"); + { + var command = Cli.Wrap("/usr/bin/soffice") + .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {resultFileDir}"); await command.ExecuteAsync(token); } From 1d618302f83ee71127aa4d5295e2305548df2c65 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 27 Jan 2023 10:11:04 +0500 Subject: [PATCH 18/29] Format code. --- .../DrillingProgram/Convert/ConvertToPdf.cs | 35 ++++++++++--------- .../DrillingProgram/DrillingProgramService.cs | 24 +++++-------- 2 files changed, 27 insertions(+), 32 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index 4c659e41..b2043a10 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -12,7 +12,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert #nullable enable sealed internal class ConvertToPdf { - private static readonly string[] filesExtensions = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + internal static readonly string[] filesExtensions = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; private static void MergeFiles(IEnumerable inputFiles, string outFile) { @@ -20,27 +20,27 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert using var doc = new Document(); using var pdf = new PdfCopy(doc, stream); doc.Open(); - var inputFilesList = inputFiles.ToList(); - foreach (var file in inputFilesList) - { + var inputFilesList = inputFiles.ToList(); + foreach (var file in inputFilesList) + { var reader = new PdfReader(file); for (int i = 0; i < reader.NumberOfPages; i++) { pdf.AddPage(pdf.GetImportedPage(reader, i + 1)); } pdf.FreeReader(reader); - reader.Close(); + reader.Close(); }; } - private static async Task StartConvertProcessAsync(string inputFileName, string resultFileDir,CancellationToken token) - { + private static async Task StartConvertProcessAsync(string inputFileName, string resultFileDir, CancellationToken token) + { var command = Cli.Wrap("/usr/bin/soffice") .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {resultFileDir}"); await command.ExecuteAsync(token); } - - public static async Task GetConverteAndMergedFileAsync(IEnumerable files, string resultPath, string convertedFilesDir,CancellationToken token) + + public static async Task GetConverteAndMergedFileAsync(IEnumerable files, string resultPath, string convertedFilesDir, CancellationToken token) { var badFiles = files.Where(f => !filesExtensions.Contains(Path.GetExtension(f))); if (badFiles.Any()) @@ -50,22 +50,23 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert } var listFiles = files .Distinct() - .Select(f => new { + .Select(f => new + { inputFile = f, - convertedFile = Path.Combine(convertedFilesDir,"pdf",Path.ChangeExtension(Path.GetFileName(f), ".pdf")) + convertedFile = Path.Combine(convertedFilesDir, "pdf", Path.ChangeExtension(Path.GetFileName(f), ".pdf")) }) .ToList(); foreach (var file in listFiles) - { - var fileExt = Path.GetExtension(file.inputFile); + { + var fileExt = Path.GetExtension(file.inputFile).ToLower(); if (fileExt != ".pdf") - { - await StartConvertProcessAsync(file.inputFile, Path.GetDirectoryName(file.convertedFile)!,token); + { + await StartConvertProcessAsync(file.inputFile, Path.GetDirectoryName(file.convertedFile)!, token); } } MergeFiles(listFiles.Select(c => c.convertedFile), resultPath); - Directory.Delete(Path.Combine(convertedFilesDir,"pdf"),true); - } + Directory.Delete(Path.Combine(convertedFilesDir, "pdf"), true); + } } #nullable disable } diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs index 32773c5d..00d2c46e 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/DrillingProgramService.cs @@ -51,7 +51,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram private const int idStateReady = 3; private const int idStateError = 4; - private static readonly string[] filePermittedExt = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + private static readonly string[] validFileExtensions = ConvertToPdf.filesExtensions; public DrillingProgramService( IAsbCloudDbContext context, @@ -163,18 +163,17 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram await EnqueueMakeProgramWorkAsync(idWell, state, token); return state; } - private bool ValidExtFile(string file) + + private static bool IsFileExtensionValid(string file) { - var fileExt = Path.GetExtension(file); - var badExt = Array.Find(filePermittedExt, e => e == fileExt); - if (badExt is null) - return false; - return true; + var fileExt = Path.GetExtension(file).ToLower(); + return validFileExtensions.Contains(fileExt); } - public async Task AddFile(int idWell, int idFileCategory, int idUser, string fileFullName, System.IO.Stream fileStream, CancellationToken token = default) + + public async Task AddFile(int idWell, int idFileCategory, int idUser, string fileFullName, Stream fileStream, CancellationToken token = default) { - if (!ValidExtFile(fileFullName)) - throw new FileFormatException($"Файл {fileFullName} - неподдерживаемого формата. Файл не может быть загружен. "); + if (!IsFileExtensionValid(fileFullName)) + throw new FileFormatException($"Файл {fileFullName} - неподдерживаемого формата. Файл не может быть загружен."); var part = await context.DrillingProgramParts .Include(p => p.RelatedUsers) @@ -346,9 +345,6 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram await NotifyPublisherOnFullAccepAsync(fileMarkDto, token); } } - - - return result; } @@ -477,8 +473,6 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram return part; } - - private async Task EnqueueMakeProgramWorkAsync(int idWell, DrillingProgramStateDto state, CancellationToken token) { if (state.IdState == idStateCreating) From 7fcb77f5b48990048193dbacf283e8b01eb63cd2 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 27 Jan 2023 11:59:51 +0500 Subject: [PATCH 19/29] Fix return types --- .../Controllers/SAUB/TelemetryDataBaseController.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/AsbCloudWebApi/Controllers/SAUB/TelemetryDataBaseController.cs b/AsbCloudWebApi/Controllers/SAUB/TelemetryDataBaseController.cs index 51640915..15e15f9b 100644 --- a/AsbCloudWebApi/Controllers/SAUB/TelemetryDataBaseController.cs +++ b/AsbCloudWebApi/Controllers/SAUB/TelemetryDataBaseController.cs @@ -72,7 +72,7 @@ namespace AsbCloudWebApi.Controllers.SAUB /// [HttpGet("{idWell}")] [Permission] - public virtual async Task> GetDataAsync(int idWell, DateTime begin = default, + public virtual async Task>> GetDataAsync(int idWell, DateTime begin = default, int intervalSec = 600, int approxPointsCount = 1024, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); @@ -102,7 +102,7 @@ namespace AsbCloudWebApi.Controllers.SAUB [Route("{idWell}/datesRange")] [Permission] [ProducesResponseType(typeof(DatesRangeDto), (int)System.Net.HttpStatusCode.OK)] - public virtual async Task GetDataDatesRangeAsync(int idWell, + public virtual async Task> GetDataDatesRangeAsync(int idWell, CancellationToken token = default) { int? idCompany = User.GetCompanyId(); From 46074b6bd1d9f3e8836b3e2e366976f58c0955f9 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 27 Jan 2023 17:31:43 +0500 Subject: [PATCH 20/29] OS identification and build start process option --- .../DrillingProgram/Convert/ConvertToPdf.cs | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index b2043a10..baf40eab 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -6,6 +6,7 @@ using System.Linq; using CliWrap; using System.Threading.Tasks; using System.Threading; +using System; namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert { @@ -33,10 +34,30 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert }; } + private static (string programFile, string programArg) getOptionsStartupProcess (string inputFileName, string resultFileDir) + { + (string programFile, string programArg) startupOptions; + if (OperatingSystem.IsWindows()) + { + startupOptions.programFile = "C:\\Program Files\\LibreOffice\\program\\soffice.exe"; + startupOptions.programArg = $"-headless -convert-to pdf {inputFileName} --outdir {resultFileDir}"; + return startupOptions; + } + if(OperatingSystem.IsLinux()) + { + startupOptions.programFile = "/usr/bin/soffice"; + startupOptions.programArg = $"--headless --convert-to pdf {inputFileName} --outdir {resultFileDir}"; + return (startupOptions); + } + + throw new NotSupportedException ("Вызов процесса в текущей операционной системе не возможен"); + } + private static async Task StartConvertProcessAsync(string inputFileName, string resultFileDir, CancellationToken token) { - var command = Cli.Wrap("/usr/bin/soffice") - .WithArguments($"--headless --convert-to pdf {inputFileName} --outdir {resultFileDir}"); + var startupOptions = getOptionsStartupProcess(inputFileName, resultFileDir); + var command = Cli.Wrap(startupOptions.programFile) + .WithArguments(startupOptions.programArg); await command.ExecuteAsync(token); } From dd0e49be0ad71323edf982eac515ed9757a89419 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 27 Jan 2023 18:16:25 +0500 Subject: [PATCH 21/29] added light console app for test "OS detection" --- ConsoleApp1/Program.cs | 107 ++++++++++++------ .../PublishProfiles/FolderProfile.pubxml | 17 +++ 2 files changed, 88 insertions(+), 36 deletions(-) create mode 100644 ConsoleApp1/Properties/PublishProfiles/FolderProfile.pubxml diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index 69e9ae49..0336fb7e 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -13,49 +13,62 @@ namespace ConsoleApp1 { static void Main(/*string[] args*/) { - string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; - Console.WriteLine($"start convert"); - var inputFiles = new List(); - var resultFile = "C:\\Test\\result.pdf"; - inputFiles.Add("11112222.docx"); - inputFiles.Add("11117777.pdf"); - inputFiles.Add("22223333.xls"); - inputFiles.Add("33334444.xlsx"); - //inputFiles.Add("33334444.tts"); + // string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + // Console.WriteLine($"start convert"); + // var inputFiles = new List(); + // var resultFile = "C:\\Test\\result.pdf"; + // inputFiles.Add("11112222.docx"); + // inputFiles.Add("11117777.pdf"); + // inputFiles.Add("22223333.xls"); + // inputFiles.Add("33334444.xlsx"); + // //inputFiles.Add("33334444.tts"); - var listOutNames = new List(); - var filteredFilesNames = inputFiles - .Distinct() - .Where(f => fileExtension.Any(fe => f.ToLower().EndsWith(fe))) - .ToList(); - FileInfo fileInfo = new FileInfo(resultFile); + // var listOutNames = new List(); + // var filteredFilesNames = inputFiles + // .Distinct() + // .Where(f => fileExtension.Any(fe => f.ToLower().EndsWith(fe))) + // .ToList(); + // FileInfo fileInfo = new FileInfo(resultFile); - //matchesExtensions(inputFiles); - foreach (var FileName in inputFiles) + // //matchesExtensions(inputFiles); + // foreach (var FileName in inputFiles) + // { + // var outputFile = Path.ChangeExtension(FileName, ".pdf"); + // var outFile = StartConvertProcessAsync(FileName, outputFile); + // Console.WriteLine($"convert file - {FileName}"); + // Console.ReadLine(); + // listOutNames.Add(outFile.Result.ToString()); + // } + // Console.WriteLine("merged files"); + // Console.ReadLine(); + // DoMerged(listOutNames, resultFile); + + + + //static void matchesExtensions(List inputFiles) + // { + // string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; + // foreach (var file in inputFiles) + // { + // var fileExt = Path.GetExtension(file); + // if (fileExtension.All(fe => fileExt != fe)) + // { + // throw new FileFormatException($"Файл с именем: {file} не может быть добавлен в список файлов для конвертации и слияния в общий файл программы бурения. Не поддерживаемый формат файла"); + // } + + // } + // } + if (OperatingSystem.IsWindows()) { - var outputFile = Path.ChangeExtension(FileName, ".pdf"); - var outFile = StartConvertProcessAsync(FileName, outputFile); - Console.WriteLine($"convert file - {FileName}"); + Console.WriteLine("win"); Console.ReadLine(); - listOutNames.Add(outFile.Result.ToString()); } - Console.WriteLine("merged files"); - Console.ReadLine(); - DoMerged(listOutNames, resultFile); - - static void matchesExtensions(List inputFiles) + if (OperatingSystem.IsLinux()) { - string[] fileExtension = { ".xlsx", ".xls", ".ods", ".odt", ".doc", ".docx", ".pdf" }; - foreach (var file in inputFiles) - { - var fileExt = Path.GetExtension(file); - if (fileExtension.All(fe => fileExt != fe)) - { - throw new FileFormatException($"Файл с именем: {file} не может быть добавлен в список файлов для конвертации и слияния в общий файл программы бурения. Не поддерживаемый формат файла"); - } - - } + Console.WriteLine("linux"); + Console.ReadLine(); } + } public static void DoMerged(IEnumerable inputFiles, string outFile) @@ -78,6 +91,25 @@ namespace ConsoleApp1 }; } + private static (string programFile, string programArg) getOptionsStartupProcess(string inputFileName, string resultFileDir) + { + (string programFile, string programArg) startupOptions; + if (OperatingSystem.IsWindows()) + { + startupOptions.programFile = "C:\\Program Files\\LibreOffice\\program\\soffice.exe"; + startupOptions.programArg = $"-headless -convert-to pdf {inputFileName} --outdir {resultFileDir}"; + return startupOptions; + } + if (OperatingSystem.IsLinux()) + { + startupOptions.programFile = "/usr/bin/soffice"; + startupOptions.programArg = $"--headless --convert-to pdf {inputFileName} --outdir {resultFileDir}"; + return (startupOptions); + } + + throw new NotSupportedException("Вызов процесса в текущей операционной системе не возможен"); + } + //public static void StartConvertProcess(string inputFileName, string outFileName) //{ // using (Process pdfprocess = new Process()) @@ -98,6 +130,9 @@ namespace ConsoleApp1 //} private static async Task StartConvertProcessAsync(string inputFileName, string outFileName) { + + var progrAndArg = getOptionsStartupProcess(inputFileName, outFileName); + //string outPath = "/home/eddie/Test/OutFiles"; string outPath = "C:\\Test\\OutFiles"; var result = Cli.Wrap("C:\\Program Files\\LibreOffice\\program\\soffice.exe") diff --git a/ConsoleApp1/Properties/PublishProfiles/FolderProfile.pubxml b/ConsoleApp1/Properties/PublishProfiles/FolderProfile.pubxml new file mode 100644 index 00000000..1002f833 --- /dev/null +++ b/ConsoleApp1/Properties/PublishProfiles/FolderProfile.pubxml @@ -0,0 +1,17 @@ + + + + + Release + Any CPU + C:\home\linux_test_test + FileSystem + net6.0 + linux-x64 + true + false + false + + \ No newline at end of file From 86c52f52568d0a7dbe5fc284d6614a2d74750cdb Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Fri, 27 Jan 2023 18:17:42 +0500 Subject: [PATCH 22/29] refact readme --- .../Services/DrillingProgram/Convert/ReadMe.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md index 952fada8..54ab5556 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ReadMe.md @@ -10,13 +10,7 @@ Windows - C:\Program Files\LibreOffice\program\soffice.exe 3. В массиве fileExtensions содержатся в виде стринг переменных необходимые расширения файлов изначально обозначенные в задаче. -При необходимости список можно расширить. - -4. Если для тестирования исходники необходимо запустить на машине под управлением Windows -необходимо поменять содержание переменной result в методе StartConvertProcessAsync на : - - var result = Cli.Wrap("C:\\Program Files\\LibreOffice\\program\\soffice.exe") - .WithArguments($"-headless -convert-to pdf {inputFileName} --outdir {outFileName}"); +При необходимости список можно расширить. From 236c32b16c1619494d86bb368d6fac9597ad5248 Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Mon, 30 Jan 2023 14:32:16 +0500 Subject: [PATCH 23/29] #7065595 fix --- .../IWellFinalDocumentsRepository.cs | 4 +- .../WellFinalDocumentsRepository.cs | 39 ++++++++++--------- .../Services/WellFinalDocumentsService.cs | 19 +++++---- .../WellFinalDocumentsServiceTest.cs | 2 +- .../WellFinalDocumentsController.cs | 6 +-- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/AsbCloudApp/Repositories/IWellFinalDocumentsRepository.cs b/AsbCloudApp/Repositories/IWellFinalDocumentsRepository.cs index 9e803029..69c19f98 100644 --- a/AsbCloudApp/Repositories/IWellFinalDocumentsRepository.cs +++ b/AsbCloudApp/Repositories/IWellFinalDocumentsRepository.cs @@ -38,14 +38,14 @@ namespace AsbCloudApp.Repositories Task> GetAvailableUsersAsync(int idWell, CancellationToken token); /// - /// Сохранение категории файла + /// Возвращаент категорию файла /// /// /// /// /// /// - Task SaveCategoryAsync(int idWell, int idCategory, int idUser, CancellationToken token); + Task GetCategoryAsync(int idWell, int idCategory, int idUser, CancellationToken token); } #nullable disable } diff --git a/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs b/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs index 8af4f375..f34294a7 100644 --- a/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs @@ -33,27 +33,27 @@ namespace AsbCloudInfrastructure.Repository /// public async Task> UpdateRangeAsync(int idWell, IEnumerable? dtos, CancellationToken token) { - if (dtos is not null) - { - var entities = dtos - .Where(dto => dto.IdsPublishers?.Any() == true) - .SelectMany(dto => dto.IdsPublishers - .Select(idUser => new WellFinalDocument - { - IdCategory = dto.IdCategory, - IdWell = idWell, - IdUser = idUser - })); + if (dtos is null) + throw new ArgumentInvalidException("Данные по категориям отсутствуют."); - var itemsToDelete = context.WellFinalDocuments.Where(d => d.IdWell == idWell); - context.WellFinalDocuments.RemoveRange(itemsToDelete); + var entities = dtos + .Where(dto => dto.IdsPublishers?.Any() == true) + .SelectMany(dto => dto.IdsPublishers + .Select(idUser => new WellFinalDocument + { + IdCategory = dto.IdCategory, + IdWell = idWell, + IdUser = idUser + })); - await context.WellFinalDocuments.AddRangeAsync(entities).ConfigureAwait(false); - await context.SaveChangesAsync(token).ConfigureAwait(false); + var itemsToDelete = context.WellFinalDocuments.Where(d => d.IdWell == idWell); + context.WellFinalDocuments.RemoveRange(itemsToDelete); + + context.WellFinalDocuments.AddRange(entities); + await context.SaveChangesAsync(token).ConfigureAwait(false); + + return entities.Adapt>(); - return entities.Adapt>(); - } - throw new ArgumentInvalidException("Данные по категориям отсутствуют."); } /// @@ -108,6 +108,7 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAvailableUsersAsync(int idWell, CancellationToken token) { var companyIds = await context.RelationCompaniesWells + .AsNoTracking() .Where(x => x.IdWell == idWell).Select(x => x.IdCompany) .ToListAsync(token) .ConfigureAwait(false); @@ -123,7 +124,7 @@ namespace AsbCloudInfrastructure.Repository } /// - public async Task SaveCategoryAsync(int idWell, int idCategory, int idUser, CancellationToken token) + public async Task GetCategoryAsync(int idWell, int idCategory, int idUser, CancellationToken token) { var entity = await context.WellFinalDocuments .AsNoTracking() diff --git a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs index d495a567..1da4b617 100644 --- a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs +++ b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs @@ -4,7 +4,6 @@ using AsbCloudApp.Repositories; using AsbCloudApp.Requests; using AsbCloudApp.Services; using Microsoft.Extensions.Configuration; -using System; using System.Collections.Generic; using System.IO; using System.Linq; @@ -51,11 +50,8 @@ namespace AsbCloudInfrastructure.Services { var data = await wellFinalDocumentsRepository.UpdateRangeAsync(idWell, dtos, token); - if (data.Any()) - { - var message = "от Вас ожидается загрузка на портал документа «{0}»"; - await GenerateMessageAsync(data, message, token); - } + var message = "от Вас ожидается загрузка на портал документа «{0}»"; + await GenerateMessageAsync(data, message, token); return data.Count(); } @@ -63,13 +59,16 @@ namespace AsbCloudInfrastructure.Services /// public async Task SaveCategoryFileAsync(int idWell, int idCategory, int idUser, Stream fileStream, string fileName, CancellationToken token) { - var dto = await wellFinalDocumentsRepository.SaveCategoryAsync(idWell, idCategory, idUser, token) + var dto = await wellFinalDocumentsRepository.GetCategoryAsync(idWell, idCategory, idUser, token) .ConfigureAwait(false); var file = await fileService.SaveAsync(dto.IdWell, dto.IdUser, dto.IdCategory, fileName, fileStream, token).ConfigureAwait(false); - return file?.Id ?? FileServiceThrewException; //TODO: изменить когда файловый сервис будет переведен на nullable + if (file is not null) + return file.Id; + + return FileServiceThrewException; } /// @@ -130,12 +129,12 @@ namespace AsbCloudInfrastructure.Services var category = await fileCategoryService.GetOrDefaultAsync(item.IdCategory, token); var well = await wellService.GetOrDefaultAsync(item.IdWell, token); - SendMessage(well, user, category.Name, message, token); + SendMessage(well, user, category.Name, message); } } } - private void SendMessage(WellDto? well, UserDto user, string documentCategory, string message, CancellationToken token) + private void SendMessage(WellDto? well, UserDto user, string documentCategory, string message) { var factory = new WellFinalDocumentMailBodyFactory(configuration); var subject = factory.MakeSubject(well, documentCategory); diff --git a/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs index 8d31d48c..290922cd 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs @@ -76,7 +76,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests wellFinalDocumentsRepository.Setup(r => r.GetByWellIdAsync(It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(wellCaseDto); - wellFinalDocumentsRepository.Setup(r => r.SaveCategoryAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) + wellFinalDocumentsRepository.Setup(r => r.GetCategoryAsync(It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny())) .ReturnsAsync(wellFinalDocumentDBDto); fileRepositoryMock = new Mock(); diff --git a/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs b/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs index d2263e9a..15c714da 100644 --- a/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs +++ b/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs @@ -52,7 +52,7 @@ namespace AsbCloudWebApi.Controllers return Forbid(); var idUser = User?.GetUserId(); - var data = await wellFinalDocumentsRepository.GetByWellIdAsync(idWell, idUser ?? default, token); + var data = await wellFinalDocumentsRepository.GetByWellIdAsync(idWell, (int)idUser!, token); return Ok(data); } @@ -89,8 +89,8 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var idUser = User.GetUserId() ?? -1; - var data = await wellFinalDocumentsService.UpdateRangeAsync(idWell, idUser, dtos, token); + var idUser = User.GetUserId(); + var data = await wellFinalDocumentsService.UpdateRangeAsync(idWell, (int)idUser!, dtos, token); return Ok(data); } From 89e5cbcf9ad9be2e17406cb9242fe57714260510 Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Mon, 30 Jan 2023 15:07:36 +0500 Subject: [PATCH 24/29] # TelemetryWirelineRunOutDto --- AsbCloudWebApi/ProtobufModel.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/AsbCloudWebApi/ProtobufModel.cs b/AsbCloudWebApi/ProtobufModel.cs index d389cd37..ea432162 100644 --- a/AsbCloudWebApi/ProtobufModel.cs +++ b/AsbCloudWebApi/ProtobufModel.cs @@ -10,10 +10,11 @@ namespace AsbCloudWebApi EnshureRegisteredDataSpin(); EnshureRegisteredDataSaub(); EnshureRegisteredWITS(); + EnshureRegisteredWirelineRunOutBaseDto(); EnshureRegisteredWirelineRunOutDto(); } - private static void EnshureRegisteredWirelineRunOutDto() + private static void EnshureRegisteredWirelineRunOutBaseDto() { var type = typeof(TelemetryWirelineRunOutBaseDto); if (RuntimeTypeModel.Default.IsDefined(type)) @@ -26,6 +27,19 @@ namespace AsbCloudWebApi .Add(5, nameof(TelemetryWirelineRunOutBaseDto.ReplaceWarnSp)); } + private static void EnshureRegisteredWirelineRunOutDto() + { + var type = typeof(TelemetryWirelineRunOutDto); + if (RuntimeTypeModel.Default.IsDefined(type)) + return; + RuntimeTypeModel.Default.Add(type, false) + .Add(1, nameof(TelemetryWirelineRunOutDto.DateTime)) + .Add(2, nameof(TelemetryWirelineRunOutDto.Hauling)) + .Add(3, nameof(TelemetryWirelineRunOutDto.HaulingWarnSp)) + .Add(4, nameof(TelemetryWirelineRunOutDto.Replace)) + .Add(5, nameof(TelemetryWirelineRunOutDto.ReplaceWarnSp)); + } + private static void EnshureRegisteredWITS() { EnshureRegisteredRecord1(); From 31aa5e6ca2363e0c762644dfa7a8671d8a4aa856 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 30 Jan 2023 17:06:22 +0500 Subject: [PATCH 25/29] nit ConvertToPdf code formatiing --- .../Services/DrillingProgram/Convert/ConvertToPdf.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs index baf40eab..b7751ba4 100644 --- a/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs +++ b/AsbCloudInfrastructure/Services/DrillingProgram/Convert/ConvertToPdf.cs @@ -34,7 +34,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert }; } - private static (string programFile, string programArg) getOptionsStartupProcess (string inputFileName, string resultFileDir) + private static (string programFile, string programArg) GetOptionsStartupProcess (string inputFileName, string resultFileDir) { (string programFile, string programArg) startupOptions; if (OperatingSystem.IsWindows()) @@ -55,9 +55,9 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram.Convert private static async Task StartConvertProcessAsync(string inputFileName, string resultFileDir, CancellationToken token) { - var startupOptions = getOptionsStartupProcess(inputFileName, resultFileDir); - var command = Cli.Wrap(startupOptions.programFile) - .WithArguments(startupOptions.programArg); + var (programFile, programArg) = GetOptionsStartupProcess(inputFileName, resultFileDir); + var command = Cli.Wrap(programFile) + .WithArguments(programArg); await command.ExecuteAsync(token); } From a2b2b98dace96a99ea38e0372ffcedc984694185 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Mon, 30 Jan 2023 17:44:05 +0500 Subject: [PATCH 26/29] nit WellFinalDocumentsService rename method --- .../Repository/WellFinalDocumentsRepository.cs | 1 - .../Services/WellFinalDocumentsService.cs | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs b/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs index f34294a7..f02db52c 100644 --- a/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs +++ b/AsbCloudInfrastructure/Repository/WellFinalDocumentsRepository.cs @@ -53,7 +53,6 @@ namespace AsbCloudInfrastructure.Repository await context.SaveChangesAsync(token).ConfigureAwait(false); return entities.Adapt>(); - } /// diff --git a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs index 1da4b617..60b80fdf 100644 --- a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs +++ b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs @@ -51,7 +51,7 @@ namespace AsbCloudInfrastructure.Services var data = await wellFinalDocumentsRepository.UpdateRangeAsync(idWell, dtos, token); var message = "от Вас ожидается загрузка на портал документа «{0}»"; - await GenerateMessageAsync(data, message, token); + await NotifyUsersAsync(data, message, token); return data.Count(); } @@ -114,12 +114,12 @@ namespace AsbCloudInfrastructure.Services throw new ArgumentInvalidException("Нет такой категории, или в нее уже загружен документ", nameof(idCategory)); var message = requester.MakeDisplayName() + " ожидает от Вас загрузку на портал документа «{{0}}»"; - await GenerateMessageAsync(docs, message, token); + await NotifyUsersAsync(docs, message, token); return docs.Count(); } - private async Task GenerateMessageAsync(IEnumerable dtos, string message, CancellationToken token) + private async Task NotifyUsersAsync(IEnumerable dtos, string message, CancellationToken token) { foreach (var item in dtos) { From e58c292d305f22803019490925eb96470ff3a685 Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Tue, 31 Jan 2023 10:13:32 +0500 Subject: [PATCH 27/29] #7065595 fix --- .../Services/IWellFinalDocumentsService.cs | 3 +-- .../Services/WellFinalDocumentsService.cs | 9 +++------ .../WellFinalDocumentsServiceTest.cs | 4 ++-- .../Controllers/WellFinalDocumentsController.cs | 16 +++++++--------- 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/AsbCloudApp/Services/IWellFinalDocumentsService.cs b/AsbCloudApp/Services/IWellFinalDocumentsService.cs index bdcb51f8..63536c7c 100644 --- a/AsbCloudApp/Services/IWellFinalDocumentsService.cs +++ b/AsbCloudApp/Services/IWellFinalDocumentsService.cs @@ -18,9 +18,8 @@ namespace AsbCloudApp.Services /// /// /// - /// /// - Task UpdateRangeAsync(int idWell, int idUser, IEnumerable? dtos, CancellationToken token); + Task UpdateRangeAsync(int idWell, IEnumerable? dtos, CancellationToken token); /// /// Получение истории файлов diff --git a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs index 1da4b617..31262718 100644 --- a/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs +++ b/AsbCloudInfrastructure/Services/WellFinalDocumentsService.cs @@ -46,7 +46,7 @@ namespace AsbCloudInfrastructure.Services } /// - public async Task UpdateRangeAsync(int idWell, int idUser, IEnumerable? dtos, CancellationToken token) + public async Task UpdateRangeAsync(int idWell, IEnumerable? dtos, CancellationToken token) { var data = await wellFinalDocumentsRepository.UpdateRangeAsync(idWell, dtos, token); @@ -65,10 +65,7 @@ namespace AsbCloudInfrastructure.Services var file = await fileService.SaveAsync(dto.IdWell, dto.IdUser, dto.IdCategory, fileName, fileStream, token).ConfigureAwait(false); - if (file is not null) - return file.Id; - - return FileServiceThrewException; + return file.Id; } /// @@ -91,7 +88,7 @@ namespace AsbCloudInfrastructure.Services /// public async Task ReNotifyPublishersAsync(int idWell, int idUser, int idCategory, CancellationToken token) { - WellCaseDto wellCase = await wellFinalDocumentsRepository.GetByWellIdAsync(idWell, idUser, token); + var wellCase = await wellFinalDocumentsRepository.GetByWellIdAsync(idWell, idUser, token); if (!wellCase.PermissionToSetPubliher) throw new ForbidException("Повторная отправка оповещений Вам не разрешена"); diff --git a/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs index 290922cd..ef1cac15 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/WellFinalDocumentsServiceTest.cs @@ -183,8 +183,8 @@ namespace AsbCloudWebApi.Tests.ServicesTests [Fact] public async Task ReNotifyPublishersAsync_deny_to_non_wrong_category() { - await Assert.ThrowsAsync( - async () => await service.ReNotifyPublishersAsync(1, users[0].Id, 13 * idWellFinalDocCategory, CancellationToken.None)); + var data = await service.ReNotifyPublishersAsync(1, users[0].Id, idWellFinalDocCategory, CancellationToken.None); + Assert.Equal(1, data); } [Fact] diff --git a/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs b/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs index 15c714da..ee89eda6 100644 --- a/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs +++ b/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs @@ -51,8 +51,8 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var idUser = User?.GetUserId(); - var data = await wellFinalDocumentsRepository.GetByWellIdAsync(idWell, (int)idUser!, token); + var idUser = User!.GetUserId()!; + var data = await wellFinalDocumentsRepository.GetByWellIdAsync(idWell, idUser.Value, token); return Ok(data); } @@ -88,9 +88,7 @@ namespace AsbCloudWebApi.Controllers { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - - var idUser = User.GetUserId(); - var data = await wellFinalDocumentsService.UpdateRangeAsync(idWell, (int)idUser!, dtos, token); + var data = await wellFinalDocumentsService.UpdateRangeAsync(idWell, dtos, token); return Ok(data); } @@ -109,8 +107,8 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var idUser = User.GetUserId() ?? -1; - var data = await wellFinalDocumentsService.ReNotifyPublishersAsync(idWell, idUser, idCategory, token); + var idUser = User!.GetUserId()!; + var data = await wellFinalDocumentsService.ReNotifyPublishersAsync(idWell, idUser.Value, idCategory, token); return Ok(data); } @@ -151,9 +149,9 @@ namespace AsbCloudWebApi.Controllers if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); - var idUser = User.GetUserId() ?? -1; + var idUser = User!.GetUserId()!; var fileStream = file.OpenReadStream(); - var data = await this.wellFinalDocumentsService.SaveCategoryFileAsync(idWell, idCategory, idUser, fileStream, file.FileName, token); + var data = await this.wellFinalDocumentsService.SaveCategoryFileAsync(idWell, idCategory, idUser.Value, fileStream, file.FileName, token); return Ok(data); } From 00a6a333e4c9a54ac088d6b66a34fa5fdecc3dd3 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 1 Feb 2023 14:38:59 +0500 Subject: [PATCH 28/29] WellFinalDocumentsController remove CancellationToken default value --- .../Controllers/WellFinalDocumentsController.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs b/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs index ee89eda6..b24898dd 100644 --- a/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs +++ b/AsbCloudWebApi/Controllers/WellFinalDocumentsController.cs @@ -46,7 +46,7 @@ namespace AsbCloudWebApi.Controllers [HttpGet("{idWell}")] [Permission] [ProducesResponseType(typeof(WellCaseDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAsync(int idWell, CancellationToken token = default) + public async Task GetAsync(int idWell, CancellationToken token) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); @@ -65,7 +65,7 @@ namespace AsbCloudWebApi.Controllers [HttpGet("{idWell}/availableUsers")] [Permission] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAvailableUsersAsync(int idWell, CancellationToken token = default) + public async Task GetAvailableUsersAsync(int idWell, CancellationToken token ) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); @@ -84,7 +84,7 @@ namespace AsbCloudWebApi.Controllers [HttpPut("{idWell}")] [Permission("WellFinalDocuments.editPublisher")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task UpdateRangeAsync(int idWell, [Required] IEnumerable dtos, CancellationToken token = default) + public async Task UpdateRangeAsync(int idWell, [Required] IEnumerable dtos, CancellationToken token ) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); @@ -102,7 +102,7 @@ namespace AsbCloudWebApi.Controllers [HttpPut("{idWell}/reNotifyPublishers")] [Permission("WellFinalDocuments.editPublisher")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task ReNotifyPublishersAsync(int idWell, [Required] int idCategory, CancellationToken token = default) + public async Task ReNotifyPublishersAsync(int idWell, [Required] int idCategory, CancellationToken token ) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); @@ -124,7 +124,7 @@ namespace AsbCloudWebApi.Controllers [ProducesResponseType(typeof(WellFinalDocumentsHistoryDto), (int)System.Net.HttpStatusCode.OK)] public async Task GetFilesHistoryByIdCategoryAsync(int idWell, [Required] int idCategory, - CancellationToken token = default) + CancellationToken token ) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); @@ -144,7 +144,7 @@ namespace AsbCloudWebApi.Controllers [HttpPost("{idWell}")] [Permission] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task SaveCategoryFileAsync(int idWell, [Required] int idCategory, [Required] IFormFile file, CancellationToken token = default) + public async Task SaveCategoryFileAsync(int idWell, [Required] int idCategory, [Required] IFormFile file, CancellationToken token ) { if (!await CanUserAccessToWellAsync(idWell, token).ConfigureAwait(false)) return Forbid(); @@ -168,7 +168,7 @@ namespace AsbCloudWebApi.Controllers return Ok(data); } - private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token = default) + private async Task CanUserAccessToWellAsync(int idWell, CancellationToken token ) { int? idCompany = User.GetCompanyId(); return idCompany is not null && await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, From e804f7de2b85a5e32c6f278dcfe188884fdc1324 Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Fri, 3 Feb 2023 09:07:53 +0500 Subject: [PATCH 29/29] Fix Add permissions for ProcessMap --- ...Add_permissions_for_ProcessMap.Designer.cs | 6981 +++++++++++++++++ ...03040530_Add_permissions_for_ProcessMap.cs | 40 + .../AsbCloudDbContextModelSnapshot.cs | 18 + .../DefaultData/EntityFillerPermission.cs | 4 + 4 files changed, 7043 insertions(+) create mode 100644 AsbCloudDb/Migrations/20230203040530_Add_permissions_for_ProcessMap.Designer.cs create mode 100644 AsbCloudDb/Migrations/20230203040530_Add_permissions_for_ProcessMap.cs diff --git a/AsbCloudDb/Migrations/20230203040530_Add_permissions_for_ProcessMap.Designer.cs b/AsbCloudDb/Migrations/20230203040530_Add_permissions_for_ProcessMap.Designer.cs new file mode 100644 index 00000000..8ea5dc81 --- /dev/null +++ b/AsbCloudDb/Migrations/20230203040530_Add_permissions_for_ProcessMap.Designer.cs @@ -0,0 +1,6981 @@ +// +using System; +using System.Text.Json; +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("20230203040530_Add_permissions_for_ProcessMap")] + partial class Add_permissions_for_ProcessMap + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .UseCollation("Russian_Russia.1251") + .HasAnnotation("ProductVersion", "6.0.7") + .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.DailyReport.DailyReport", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("StartDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("start_date") + .HasComment("Дата отчёта"); + + b.Property("Info") + .HasColumnType("jsonb") + .HasColumnName("info") + .HasComment("Список параметров для отчёта"); + + b.HasKey("IdWell", "StartDate") + .HasName("t_id_well_date_start_pk"); + + b.ToTable("t_daily_report"); + + b.HasComment("Ежедневные отчёты"); + }); + + 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.DetectedOperation", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .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("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category") + .HasComment("Id категории операции"); + + b.Property("IdReasonOfEnd") + .HasColumnType("integer") + .HasColumnName("id_reason_of_end") + .HasComment("Код признака окончания операции"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("IdUsersAtStart") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя по телеметрии на момент начала операции"); + + b.Property("Value") + .HasColumnType("double precision") + .HasColumnName("value") + .HasComment("Ключевой показатель операции"); + + b.HasKey("Id"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_detected_operation"); + + b.HasComment("автоматически определенные операции по телеметрии"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Driller", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name") + .HasComment("Имя"); + + b.Property("Patronymic") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("patronymic") + .HasComment("Отчество"); + + b.Property("Surname") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("surname") + .HasComment("Фамилия"); + + b.HasKey("Id"); + + b.ToTable("t_driller"); + + b.HasComment("Бурильщик"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("IdFileCategory") + .HasColumnType("integer") + .HasColumnName("id_file_category"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.HasKey("Id"); + + b.HasIndex("IdFileCategory"); + + b.HasIndex("IdWell", "IdFileCategory") + .IsUnique(); + + b.ToTable("t_drilling_program_part"); + + 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 = 1000, + Name = "Программа бурения" + }, + new + { + Id = 1001, + Name = "Задание от геологов" + }, + new + { + Id = 1002, + Name = "Профиль ствола скважины (ННБ)" + }, + new + { + Id = 1003, + Name = "Технологические расчеты (ННБ)" + }, + new + { + Id = 1004, + Name = "Долотная программа" + }, + new + { + Id = 1005, + Name = "Программа по растворам" + }, + new + { + Id = 1006, + Name = "Программа геофизических исследований" + }, + new + { + Id = 1007, + Name = "Планы спусков обсадных колонн" + }, + new + { + Id = 1008, + Name = "Программы цементирования обсадных колонн" + }, + new + { + Id = 10000, + Name = "Проект на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10001, + Name = "Программа на бурение транспортного и горизонтального участков скважины" + }, + new + { + Id = 10002, + Name = "Акт о начале бурения" + }, + new + { + Id = 10003, + Name = "План работ спуска и цементирования направления" + }, + new + { + Id = 10004, + Name = "Программа цементирования направления" + }, + new + { + Id = 10005, + Name = "Мера обсадных труб (направление)" + }, + new + { + Id = 10006, + Name = "Акт на выполненные работы по цементированию направления" + }, + new + { + Id = 10007, + Name = "Отчет по цементированию направления (график)" + }, + new + { + Id = 10008, + Name = "План работ спуска и цементирования кондуктора" + }, + new + { + Id = 10009, + Name = "Программа цементирования (кондуктор)" + }, + new + { + Id = 10010, + Name = "Мера обсадных труб (кондуктор)" + }, + new + { + Id = 10011, + Name = "Карта крепления кондуктора" + }, + new + { + Id = 10012, + Name = "Акт на выполненные работы по цементированию кондуктора" + }, + new + { + Id = 10013, + Name = "Отчет по цементированию кондуктора (график)" + }, + new + { + Id = 10014, + Name = "Акт о замере расстояния от стола ротора до муфты кондуктора" + }, + new + { + Id = 10015, + Name = "Акт опресовки цементного кольца за кондуктором" + }, + new + { + Id = 10016, + Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором" + }, + new + { + Id = 10017, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором" + }, + new + { + Id = 10018, + Name = "План работ на крепление обсадной колонны (эк. колонна)" + }, + new + { + Id = 10019, + Name = "Программа цементирования (эк. колонна)" + }, + new + { + Id = 10020, + Name = "Мера труб эксплуатационной колонны" + }, + new + { + Id = 10021, + Name = "Карта по креплению скважины (эк. колонна)" + }, + new + { + Id = 10022, + Name = "Акт на установку пружинных центраторов" + }, + new + { + Id = 10023, + Name = "Отчет по цементированию эксплуатационной колонны (график)" + }, + new + { + Id = 10024, + Name = "Акт на выполненные работы по цементированию эксплуатационной колонны" + }, + new + { + Id = 10025, + Name = "Акт об испытании эк. колонны на герметичность (СТОП)" + }, + new + { + Id = 10026, + Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной" + }, + new + { + Id = 10027, + Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной" + }, + new + { + Id = 10028, + Name = "Акт на вскрытие продуктивного пласта" + }, + new + { + Id = 10029, + Name = "Акт замера параметров раствора при бурении горизонтального участка" + }, + new + { + Id = 10030, + Name = "Разрешение на спуск «хвостовика» (телефонограмма)" + }, + new + { + Id = 10031, + Name = "План работ на спуск «хвостовика»" + }, + new + { + Id = 10032, + Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»" + }, + new + { + Id = 10033, + Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»" + }, + new + { + Id = 10034, + Name = "Мера обсадных труб (хвостовик)" + }, + new + { + Id = 10035, + Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора" + }, + new + { + Id = 10036, + Name = "Акт о переводе скважины на тех. воду" + }, + new + { + Id = 10037, + Name = "Акт об окончании бурения" + }, + new + { + Id = 10038, + Name = "Акт на передачу скважины в освоение (КРС)" + }, + new + { + Id = 10039, + Name = "Акт на опресовку межколонного пространства с КРС" + }, + new + { + Id = 10040, + Name = "Акт на сдачу скважины в ЦДНГ" + }, + new + { + Id = 10041, + Name = "Паспорт ОУС (заполняется геологами)" + }, + new + { + Id = 10042, + Name = "Паспорт скважины (заполняется геологами)" + }, + new + { + Id = 10043, + Name = "Фактические данные бурения (вставляются в паспорт скважины)" + }); + }); + + 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("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 - отклонен, 1 - согласован"); + + 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.LimitingParameter", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start"); + + b.Property("IdFeedRegulator") + .HasColumnType("smallint") + .HasColumnName("id_feed_regulator"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.HasKey("Id"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_limiting_parameter"); + + 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.OperationValue", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Конечная глубина"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Старотовая глубина"); + + b.Property("IdOperationCategory") + .HasColumnType("integer") + .HasColumnName("id_operation_category") + .HasComment("Ид категории операции"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Ид скважины"); + + b.Property("StandardValue") + .HasColumnType("double precision") + .HasColumnName("standard_value") + .HasComment("Нормативный показатель"); + + b.Property("TargetValue") + .HasColumnType("double precision") + .HasColumnName("target_value") + .HasComment("Целевой показатель"); + + b.HasKey("Id"); + + b.HasIndex("IdOperationCategory"); + + b.HasIndex("IdWell"); + + b.ToTable("t_operationvalue"); + + b.HasComment("Целевые/нормативные показатели операции"); + }); + + 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("Разрешения на доступ к данным"); + + b.HasData( + new + { + Id = 100, + Description = "Разрешение удалять админ. Кусты", + Name = "AdminCluster.delete" + }, + new + { + Id = 101, + Description = "Разрешение редактировать админ. Кусты", + Name = "AdminCluster.edit" + }, + new + { + Id = 102, + Description = "Разрешение просматривать админ. Кусты", + Name = "AdminCluster.get" + }, + new + { + Id = 103, + Description = "Разрешение удалять админ. Компании", + Name = "AdminCompany.delete" + }, + new + { + Id = 104, + Description = "Разрешение редактировать админ. Компании", + Name = "AdminCompany.edit" + }, + new + { + Id = 105, + Description = "Разрешение просматривать админ. Компании", + Name = "AdminCompany.get" + }, + new + { + Id = 106, + Description = "Разрешение удалять админ. Типы компаний", + Name = "AdminCompanyType.delete" + }, + new + { + Id = 107, + Description = "Разрешение редактировать админ. Типы компаний", + Name = "AdminCompanyType.edit" + }, + new + { + Id = 108, + Description = "Разрешение просматривать админ. Типы компаний", + Name = "AdminCompanyType.get" + }, + new + { + Id = 109, + Description = "Разрешение удалять админ. Месторождения", + Name = "AdminDeposit.delete" + }, + new + { + Id = 110, + Description = "Разрешение редактировать админ. Месторождения", + Name = "AdminDeposit.edit" + }, + new + { + Id = 111, + Description = "Разрешение просматривать админ. Месторождения", + Name = "AdminDeposit.get" + }, + new + { + Id = 112, + Description = "Разрешение удалять админ. Разрешения", + Name = "AdminPermission.delete" + }, + new + { + Id = 113, + Description = "Разрешение редактировать админ. Разрешения", + Name = "AdminPermission.edit" + }, + new + { + Id = 114, + Description = "Разрешение просматривать админ. Разрешения", + Name = "AdminPermission.get" + }, + new + { + Id = 115, + Description = "Разрешение удалять админ. Телеметрию", + Name = "AdminTelemetry.delete" + }, + new + { + Id = 116, + Description = "Разрешение редактировать админ. Телеметрию", + Name = "AdminTelemetry.edit" + }, + new + { + Id = 117, + Description = "Разрешение просматривать админ. Телеметрию", + Name = "AdminTelemetry.get" + }, + new + { + Id = 118, + Description = "Разрешение удалять админ. Пользователей", + Name = "AdminUser.delete" + }, + new + { + Id = 119, + Description = "Разрешение редактировать админ. Пользователей", + Name = "AdminUser.edit" + }, + new + { + Id = 120, + Description = "Разрешение просматривать админ. Пользователей", + Name = "AdminUser.get" + }, + new + { + Id = 121, + Description = "Разрешение удалять админ. Роли пользователей", + Name = "AdminUserRole.delete" + }, + new + { + Id = 122, + Description = "Разрешение редактировать админ. Роли пользователей", + Name = "AdminUserRole.edit" + }, + new + { + Id = 123, + Description = "Разрешение просматривать админ. Роли пользователей", + Name = "AdminUserRole.get" + }, + new + { + Id = 124, + Description = "Разрешение удалять админ. Скважины", + Name = "AdminWell.delete" + }, + new + { + Id = 125, + Description = "Разрешение редактировать админ. Скважины", + Name = "AdminWell.edit" + }, + new + { + Id = 126, + Description = "Разрешение просматривать админ. Скважины", + Name = "AdminWell.get" + }, + new + { + Id = 127, + Description = "Разрешение удалять админ. Подсистемы", + Name = "AdminSubsytem.delete" + }, + new + { + Id = 128, + Description = "Разрешение редактировать админ. Подсистемы", + Name = "AdminSubsytem.edit" + }, + new + { + Id = 129, + Description = "Разрешение просматривать админ. Подсистемы", + Name = "AdminSubsytem.get" + }, + new + { + Id = 200, + Description = "Разрешение редактировать 0", + Name = "Auth.edit" + }, + new + { + Id = 201, + Description = "Разрешение просматривать 0", + Name = "Auth.get" + }, + new + { + Id = 202, + Description = "Разрешение просматривать Кусты", + Name = "Cluster.get" + }, + new + { + Id = 203, + Description = "Разрешение просматривать Месторождения", + Name = "Deposit.get" + }, + new + { + Id = 204, + Description = "Разрешение удалять РТК", + Name = "DrillFlowChart.delete" + }, + new + { + Id = 205, + Description = "Разрешение редактировать РТК", + Name = "DrillFlowChart.edit" + }, + new + { + Id = 206, + Description = "Разрешение просматривать РТК", + Name = "DrillFlowChart.get" + }, + new + { + Id = 207, + Description = "Разрешение удалять Программу бурения", + Name = "DrillingProgram.delete" + }, + new + { + Id = 208, + Description = "Разрешение редактировать Программу бурения", + Name = "DrillingProgram.edit" + }, + new + { + Id = 209, + Description = "Разрешение просматривать Программу бурения", + Name = "DrillingProgram.get" + }, + new + { + Id = 210, + Description = "Разрешение удалять Режимы бурения", + Name = "DrillParams.delete" + }, + new + { + Id = 211, + Description = "Разрешение редактировать Режимы бурения", + Name = "DrillParams.edit" + }, + new + { + Id = 212, + Description = "Разрешение просматривать Режимы бурения", + Name = "DrillParams.get" + }, + new + { + Id = 213, + Description = "Разрешение удалять Файлы", + Name = "File.delete" + }, + new + { + Id = 214, + Description = "Разрешение редактировать Файлы", + Name = "File.edit" + }, + new + { + Id = 215, + Description = "Разрешение просматривать Файлы", + Name = "File.get" + }, + new + { + Id = 216, + Description = "Разрешение удалять Измерения", + Name = "Measure.delete" + }, + new + { + Id = 217, + Description = "Разрешение редактировать Измерения", + Name = "Measure.edit" + }, + new + { + Id = 218, + Description = "Разрешение просматривать Измерения", + Name = "Measure.get" + }, + new + { + Id = 219, + Description = "Разрешение просматривать Сообщения телеметрии", + Name = "Message.get" + }, + new + { + Id = 220, + Description = "Разрешение просматривать Статистику по операциям", + Name = "OperationStat.get" + }, + new + { + Id = 221, + Description = "Разрешение редактировать Рапорта", + Name = "Report.edit" + }, + new + { + Id = 222, + Description = "Разрешение просматривать Рапорта", + Name = "Report.get" + }, + new + { + Id = 223, + Description = "Разрешение просматривать админ. Системная статистика", + Name = "RequestTracker.get" + }, + new + { + Id = 224, + Description = "Разрешение удалять Рекомендации уставок", + Name = "Setpoints.delete" + }, + new + { + Id = 225, + Description = "Разрешение редактировать Рекомендации уставок", + Name = "Setpoints.edit" + }, + new + { + Id = 226, + Description = "Разрешение просматривать Рекомендации уставок", + Name = "Setpoints.get" + }, + new + { + Id = 227, + Description = "Разрешение редактировать Телеметрии", + Name = "Telemetry.edit" + }, + new + { + Id = 228, + Description = "Разрешение просматривать Анализ телеметрии", + Name = "TelemetryAnalytics.get" + }, + new + { + Id = 229, + Description = "Разрешение редактировать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.edit" + }, + new + { + Id = 230, + Description = "Разрешение просматривать Данные телеметрии по САУБ", + Name = "TelemetryDataSaub.get" + }, + new + { + Id = 231, + Description = "Разрешение редактировать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.edit" + }, + new + { + Id = 232, + Description = "Разрешение просматривать Данные телеметрии по SpinMaster", + Name = "TelemetryDataSpin.get" + }, + new + { + Id = 233, + Description = "Разрешение редактировать Скважины", + Name = "Well.edit" + }, + new + { + Id = 234, + Description = "Разрешение просматривать Скважины", + Name = "Well.get" + }, + new + { + Id = 235, + Description = "Разрешение редактировать Композитные скважины", + Name = "WellComposite.edit" + }, + new + { + Id = 236, + Description = "Разрешение просматривать Композитные скважины", + Name = "WellComposite.get" + }, + new + { + Id = 237, + Description = "Разрешение удалять Операции по скважинам", + Name = "WellOperation.delete" + }, + new + { + Id = 238, + Description = "Разрешение редактировать Операции по скважинам", + Name = "WellOperation.edit" + }, + new + { + Id = 239, + Description = "Разрешение просматривать Операции по скважинам", + Name = "WellOperation.get" + }, + new + { + Id = 240, + Description = "Разрешение редактировать Файлы категории 1 (Растворный сервис)", + Name = "File.edit1" + }, + new + { + Id = 241, + Description = "Разрешение редактировать Файлы категории 2 (Цементирование)", + Name = "File.edit2" + }, + new + { + Id = 242, + Description = "Разрешение редактировать Файлы категории 3 (ННБ)", + Name = "File.edit3" + }, + new + { + Id = 243, + Description = "Разрешение редактировать Файлы категории 4 (ГТИ)", + Name = "File.edit4" + }, + new + { + Id = 244, + Description = "Разрешение редактировать Файлы категории 5 (Документы по скважине)", + Name = "File.edit5" + }, + new + { + Id = 245, + Description = "Разрешение редактировать Файлы категории 6 (Супервайзер)", + Name = "File.edit6" + }, + new + { + Id = 246, + Description = "Разрешение редактировать Файлы категории 7 (Мастер)", + Name = "File.edit7" + }, + new + { + Id = 247, + Description = "Разрешение редактировать Файлы категории 8 (Долотный сервис)", + Name = "File.edit8" + }, + new + { + Id = 248, + Description = "Разрешение редактировать Файлы категории 9 (Буровой подрядчик)", + Name = "File.edit9" + }, + new + { + Id = 249, + Description = "Разрешение редактировать Файлы категории 10 (Сервис по заканчиванию скважины)", + Name = "File.edit10" + }, + new + { + Id = 250, + Description = "Разрешение редактировать Файлы категории 11 (Рапорт)", + Name = "File.edit11" + }, + new + { + Id = 251, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit12" + }, + new + { + Id = 252, + Description = "Разрешение редактировать Файлы категории 12", + Name = "File.edit13" + }, + new + { + Id = 253, + Description = "Разрешение редактировать Файлы категории 13", + Name = "File.edit14" + }, + new + { + Id = 254, + Description = "Разрешение редактировать Файлы категории 14", + Name = "File.edit15" + }, + new + { + Id = 255, + Description = "Разрешение редактировать Файлы категории 15", + Name = "File.edit16" + }, + new + { + Id = 256, + Description = "Разрешение редактировать Файлы категории 16", + Name = "File.edit17" + }, + new + { + Id = 257, + Description = "Разрешение редактировать Файлы категории 17", + Name = "File.edit18" + }, + new + { + Id = 258, + Description = "Разрешение редактировать Файлы категории 18", + Name = "File.edit19" + }, + new + { + Id = 259, + Description = "Разрешение редактировать Файлы категории 19", + Name = "File.edit20" + }, + new + { + Id = 260, + Description = "Разрешение редактировать Файлы категории 20", + Name = "File.edit21" + }, + new + { + Id = 261, + Description = "Разрешение редактировать Файлы категории 21", + Name = "File.edit22" + }, + new + { + Id = 262, + Description = "Разрешение редактировать Файлы категории 22", + Name = "File.edit23" + }, + new + { + Id = 263, + Description = "Разрешение редактировать Файлы категории 23", + Name = "File.edit24" + }, + new + { + Id = 264, + Description = "Разрешение редактировать Файлы категории 24", + Name = "File.edit25" + }, + new + { + Id = 265, + Description = "Разрешение редактировать Файлы категории 25", + Name = "File.edit26" + }, + new + { + Id = 266, + Description = "Разрешение редактировать Файлы категории 26", + Name = "File.edit27" + }, + new + { + Id = 267, + Description = "Разрешение редактировать Файлы категории 27", + Name = "File.edit28" + }, + new + { + Id = 268, + Description = "Разрешение редактировать Файлы категории 28", + Name = "File.edit29" + }, + new + { + Id = 269, + Description = "Разрешение редактировать Файлы категории 29", + Name = "File.edit30" + }, + new + { + Id = 380, + Description = "Разрешение просматривать список бурильщиков", + Name = "Driller.get" + }, + new + { + Id = 381, + Description = "Разрешение редактировать бурильщика", + Name = "Driller.edit" + }, + new + { + Id = 382, + Description = "Разрешение удалять бурильщик", + Name = "Driller.delete" + }, + new + { + Id = 383, + Description = "Разрешение просматривать графики бурильщиков", + Name = "Schedule.get" + }, + new + { + Id = 384, + Description = "Разрешение редактировать график бурильщика", + Name = "Schedule.edit" + }, + new + { + Id = 385, + Description = "Разрешение удалять график бурильщика", + Name = "Schedule.delete" + }, + new + { + Id = 386, + Description = "Разрешение просматривать суточный рапорт", + Name = "DailyReport.get" + }, + new + { + Id = 387, + Description = "Разрешение редактировать суточный рапорт", + Name = "DailyReport.edit" + }, + new + { + Id = 388, + Description = "Разрешение просматривать авто. определенные операции", + Name = "DetectedOperation.get" + }, + new + { + Id = 389, + Description = "Разрешение просматривать целевые значения", + Name = "OperationValue.get" + }, + new + { + Id = 390, + Description = "Разрешение редактировать целевые значения", + Name = "OperationValue.edit" + }, + new + { + Id = 391, + Description = "Разрешение удалять целевые значения", + Name = "OperationValue.delete" + }, + new + { + Id = 400, + Description = "Разрешение просматривать инфо по wits параметрам", + Name = "WitsInfo.get" + }, + new + { + Id = 401, + Description = "Разрешение просматривать WITS record 1", + Name = "WitsRecord1.get" + }, + new + { + Id = 407, + Description = "Разрешение просматривать WITS record 7", + Name = "WitsRecord7.get" + }, + new + { + Id = 408, + Description = "Разрешение просматривать WITS record 8", + Name = "WitsRecord8.get" + }, + new + { + Id = 450, + Description = "Разрешение просматривать WITS record 50", + Name = "WitsRecord50.get" + }, + new + { + Id = 460, + Description = "Разрешение просматривать WITS record 60", + Name = "WitsRecord60.get" + }, + new + { + Id = 461, + Description = "Разрешение просматривать WITS record 61", + Name = "WitsRecord61.get" + }, + new + { + Id = 500, + Description = "Разрешение удалять Категорий документов файлов", + Name = "FileCategory.delete" + }, + new + { + Id = 501, + Description = "Разрешение редактировать Категорий документов файлов", + Name = "FileCategory.edit" + }, + new + { + Id = 502, + Description = "Разрешение просматривать Категорий документов файлов", + Name = "FileCategory.get" + }, + new + { + Id = 503, + Description = "Разрешение удалять Дело скважины", + Name = "WellFinalDocuments.delete" + }, + new + { + Id = 504, + Description = "Разрешение редактировать Дело скважины", + Name = "WellFinalDocuments.edit" + }, + new + { + Id = 505, + Description = "Разрешение просматривать Дело скважины", + Name = "WellFinalDocuments.get" + }, + new + { + Id = 506, + Description = "Разрешение редактировать ответственных за загрузку файла Дело скважины", + Name = "WellFinalDocuments.editPublisher" + }, + new + { + Id = 507, + Description = "Разрешение просматривать наработка талевого каната", + Name = "TelemetryWirelineRunOut.get" + }, + new + { + Id = 510, + Description = "Разрешение просматривать плановая траектория", + Name = "TelemetryWirelineRunOut.get" + }, + new + { + Id = 511, + Description = "Разрешение редактировать плановая траектория", + Name = "TelemetryWirelineRunOut.edit" + }, + new + { + Id = 512, + Description = "Разрешение удалять плановая траектория", + Name = "TelemetryWirelineRunOut.delete" + }, + new + { + Id = 513, + Description = "Разрешение просматривать РТК", + Name = "ProcessMap.get" + }, + new + { + Id = 514, + Description = "Разрешение редактировать РТК", + Name = "ProcessMap.edit" + }, + new + { + Id = 515, + Description = "Разрешение удалять РТК", + Name = "ProcessMap.delete" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PlannedTrajectory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AbsoluteMark") + .HasColumnType("double precision") + .HasColumnName("absolute_mark") + .HasComment("Абсолютная отметка"); + + b.Property("AngleIntensity") + .HasColumnType("double precision") + .HasColumnName("angle_intensity") + .HasComment("Интенсивность по углу"); + + b.Property("AzimuthGeo") + .HasColumnType("double precision") + .HasColumnName("azimuth_geo") + .HasComment("Азимут Географ."); + + b.Property("AzimuthIntensity") + .HasColumnType("double precision") + .HasColumnName("azimuth_intensity") + .HasComment("Интенсивность по азимуту"); + + b.Property("AzimuthMagnetic") + .HasColumnType("double precision") + .HasColumnName("azimuth_magnetic") + .HasComment("Азимут Магнитный"); + + b.Property("Comment") + .HasColumnType("text") + .HasColumnName("comment") + .HasComment("Комментарии"); + + b.Property("EastCartographic") + .HasColumnType("double precision") + .HasColumnName("east_cartographic") + .HasComment("Восток картографический"); + + b.Property("EastOrifice") + .HasColumnType("double precision") + .HasColumnName("east_orifice") + .HasComment("Восток отн-но устья"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("ID пользователя который внес/изменил запись"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("ID скважины"); + + b.Property("NorthCartographic") + .HasColumnType("double precision") + .HasColumnName("north_cartographic") + .HasComment("Север картографический"); + + b.Property("NorthOrifice") + .HasColumnType("double precision") + .HasColumnName("north_orifice") + .HasComment("Север отн-но устья"); + + b.Property("OrificeOffset") + .HasColumnType("double precision") + .HasColumnName("orifice_offset") + .HasComment("Смещение от устья"); + + b.Property("SpatialIntensity") + .HasColumnType("double precision") + .HasColumnName("spatial_intensity") + .HasComment("Пространственная интенсивность"); + + b.Property("UpdateDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("update_date") + .HasComment("Дата загрузки траектории"); + + b.Property("VerticalDepth") + .HasColumnType("double precision") + .HasColumnName("vertical_depth") + .HasComment("Глубина вертикальная"); + + b.Property("WellboreDepth") + .HasColumnType("double precision") + .HasColumnName("wellbore_depth") + .HasComment("Глубина по стволу"); + + b.Property("ZenithAngle") + .HasColumnType("double precision") + .HasColumnName("zenith_angle") + .HasComment("Угол зенитный"); + + b.HasKey("Id"); + + b.HasIndex("IdUser"); + + b.HasIndex("IdWell"); + + b.ToTable("t_planned_trajectory"); + + b.HasComment("Загрузка плановой траектории"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMap", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("AxialLoadFact") + .HasColumnType("double precision") + .HasColumnName("axial_load_fact") + .HasComment("Нагрузка, факт"); + + b.Property("AxialLoadPlan") + .HasColumnType("double precision") + .HasColumnName("axial_load_plan") + .HasComment("Нагрузка, план"); + + b.Property("DepthEnd") + .HasColumnType("double precision") + .HasColumnName("depth_end") + .HasComment("Глубина окончания интервала"); + + b.Property("DepthStart") + .HasColumnType("double precision") + .HasColumnName("depth_start") + .HasComment("Стартовая глубина"); + + b.Property("FlowFact") + .HasColumnType("double precision") + .HasColumnName("flow_fact") + .HasComment("Расход, факт"); + + b.Property("FlowPlan") + .HasColumnType("double precision") + .HasColumnName("flow_plan") + .HasComment("Расход, план"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user") + .HasComment("Id пользователя"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("well_id") + .HasComment("Id скважины"); + + b.Property("IdWellSectionType") + .HasColumnType("integer") + .HasColumnName("id_wellsection_type") + .HasComment("Тип секции"); + + b.Property("LastUpdate") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_update") + .HasComment("Дата последнего изменения"); + + b.Property("PressureFact") + .HasColumnType("double precision") + .HasColumnName("pressure_fact") + .HasComment("Перепад давления, факт"); + + b.Property("PressurePlan") + .HasColumnType("double precision") + .HasColumnName("pressure_plan") + .HasComment("Перепад давления, план"); + + b.Property("RopPlan") + .HasColumnType("double precision") + .HasColumnName("rop_plan") + .HasComment("Плановая механическая скорость, м/ч"); + + b.Property("TopDriveSpeedFact") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_fact") + .HasComment("Обороты на ВСП, факт"); + + b.Property("TopDriveSpeedPlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_speed_plan") + .HasComment("Обороты на ВСП, план"); + + b.Property("TopDriveTorqueFact") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_fact") + .HasComment("Момент на ВСП, факт"); + + b.Property("TopDriveTorquePlan") + .HasColumnType("double precision") + .HasColumnName("top_drive_torque_plan") + .HasComment("Момент на ВСП, план"); + + b.HasKey("Id"); + + b.HasIndex("IdWell"); + + b.HasIndex("IdWellSectionType"); + + b.ToTable("t_process_map"); + + 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.RelationUserDrillingProgramPart", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdDrillingProgramPart") + .HasColumnType("integer") + .HasColumnName("id_drilling_program_part"); + + b.Property("IdUserRole") + .HasColumnType("integer") + .HasColumnName("id_role") + .HasComment("1 - publisher, 2 - approver"); + + b.HasKey("IdUser", "IdDrillingProgramPart") + .HasName("t_relation_user_drilling_program_part_pk"); + + b.HasIndex("IdDrillingProgramPart"); + + b.ToTable("t_relation_user_drilling_program_part"); + + 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("Отношение ролей пользователей и разрешений доступа"); + + b.HasData( + new + { + IdUserRole = 1100, + IdPermission = 102 + }, + new + { + IdUserRole = 1100, + IdPermission = 111 + }, + new + { + IdUserRole = 1101, + IdPermission = 101 + }, + new + { + IdUserRole = 1101, + IdPermission = 100 + }, + new + { + IdUserRole = 1102, + IdPermission = 105 + }, + new + { + IdUserRole = 1102, + IdPermission = 108 + }, + new + { + IdUserRole = 1103, + IdPermission = 104 + }, + new + { + IdUserRole = 1103, + IdPermission = 103 + }, + new + { + IdUserRole = 1104, + IdPermission = 108 + }, + new + { + IdUserRole = 1105, + IdPermission = 107 + }, + new + { + IdUserRole = 1105, + IdPermission = 106 + }, + new + { + IdUserRole = 1106, + IdPermission = 111 + }, + new + { + IdUserRole = 1107, + IdPermission = 110 + }, + new + { + IdUserRole = 1107, + IdPermission = 109 + }, + new + { + IdUserRole = 1108, + IdPermission = 114 + }, + new + { + IdUserRole = 1109, + IdPermission = 113 + }, + new + { + IdUserRole = 1109, + IdPermission = 112 + }, + new + { + IdUserRole = 1110, + IdPermission = 123 + }, + new + { + IdUserRole = 1110, + IdPermission = 114 + }, + new + { + IdUserRole = 1111, + IdPermission = 122 + }, + new + { + IdUserRole = 1111, + IdPermission = 121 + }, + new + { + IdUserRole = 1112, + IdPermission = 117 + }, + new + { + IdUserRole = 1113, + IdPermission = 105 + }, + new + { + IdUserRole = 1113, + IdPermission = 123 + }, + new + { + IdUserRole = 1113, + IdPermission = 120 + }, + new + { + IdUserRole = 1114, + IdPermission = 119 + }, + new + { + IdUserRole = 1114, + IdPermission = 118 + }, + new + { + IdUserRole = 1114, + IdPermission = 200 + }, + new + { + IdUserRole = 1115, + IdPermission = 223 + }, + new + { + IdUserRole = 1116, + IdPermission = 105 + }, + new + { + IdUserRole = 1116, + IdPermission = 102 + }, + new + { + IdUserRole = 1116, + IdPermission = 117 + }, + new + { + IdUserRole = 1116, + IdPermission = 126 + }, + new + { + IdUserRole = 1117, + IdPermission = 125 + }, + new + { + IdUserRole = 1117, + IdPermission = 124 + }, + new + { + IdUserRole = 1200, + IdPermission = 203 + }, + new + { + IdUserRole = 1200, + IdPermission = 230 + }, + new + { + IdUserRole = 1201, + IdPermission = 202 + }, + new + { + IdUserRole = 1201, + IdPermission = 203 + }, + new + { + IdUserRole = 1201, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 203 + }, + new + { + IdUserRole = 1202, + IdPermission = 220 + }, + new + { + IdUserRole = 1202, + IdPermission = 236 + }, + new + { + IdUserRole = 1202, + IdPermission = 212 + }, + new + { + IdUserRole = 1203, + IdPermission = 235 + }, + new + { + IdUserRole = 1204, + IdPermission = 202 + }, + new + { + IdUserRole = 1204, + IdPermission = 203 + }, + new + { + IdUserRole = 1205, + IdPermission = 215 + }, + new + { + IdUserRole = 1206, + IdPermission = 203 + }, + new + { + IdUserRole = 1206, + IdPermission = 206 + }, + new + { + IdUserRole = 1207, + IdPermission = 205 + }, + new + { + IdUserRole = 1208, + IdPermission = 218 + }, + new + { + IdUserRole = 1209, + IdPermission = 217 + }, + new + { + IdUserRole = 1210, + IdPermission = 203 + }, + new + { + IdUserRole = 1210, + IdPermission = 230 + }, + new + { + IdUserRole = 1210, + IdPermission = 219 + }, + new + { + IdUserRole = 1211, + IdPermission = 203 + }, + new + { + IdUserRole = 1211, + IdPermission = 220 + }, + new + { + IdUserRole = 1211, + IdPermission = 239 + }, + new + { + IdUserRole = 1212, + IdPermission = 238 + }, + new + { + IdUserRole = 1212, + IdPermission = 237 + }, + new + { + IdUserRole = 1213, + IdPermission = 203 + }, + new + { + IdUserRole = 1213, + IdPermission = 239 + }, + new + { + IdUserRole = 1213, + IdPermission = 212 + }, + new + { + IdUserRole = 1214, + IdPermission = 211 + }, + new + { + IdUserRole = 1214, + IdPermission = 210 + }, + new + { + IdUserRole = 1215, + IdPermission = 203 + }, + new + { + IdUserRole = 1215, + IdPermission = 222 + }, + new + { + IdUserRole = 1216, + IdPermission = 221 + }, + new + { + IdUserRole = 1217, + IdPermission = 226 + }, + new + { + IdUserRole = 1218, + IdPermission = 225 + }, + new + { + IdUserRole = 1218, + IdPermission = 224 + }, + new + { + IdUserRole = 1219, + IdPermission = 203 + }, + new + { + IdUserRole = 1219, + IdPermission = 206 + }, + new + { + IdUserRole = 1219, + IdPermission = 230 + }, + new + { + IdUserRole = 1219, + IdPermission = 232 + }, + new + { + IdUserRole = 1220, + IdPermission = 203 + }, + new + { + IdUserRole = 1220, + IdPermission = 228 + }, + new + { + IdUserRole = 1221, + IdPermission = 202 + }, + new + { + IdUserRole = 1221, + IdPermission = 203 + }, + new + { + IdUserRole = 1221, + IdPermission = 220 + }, + new + { + IdUserRole = 1221, + IdPermission = 234 + }, + new + { + IdUserRole = 1500, + IdPermission = 507 + }, + new + { + IdUserRole = 1500, + IdPermission = 510 + }, + new + { + IdUserRole = 1501, + IdPermission = 214 + }, + new + { + IdUserRole = 1501, + IdPermission = 213 + }, + new + { + IdUserRole = 1502, + IdPermission = 207 + }, + new + { + IdUserRole = 1502, + IdPermission = 208 + }, + new + { + IdUserRole = 2000, + IdPermission = 205 + }, + new + { + IdUserRole = 2000, + IdPermission = 204 + }, + new + { + IdUserRole = 2000, + IdPermission = 245 + }, + new + { + IdUserRole = 2001, + IdPermission = 244 + }, + new + { + IdUserRole = 2001, + IdPermission = 245 + }, + new + { + IdUserRole = 2002, + IdPermission = 244 + }, + new + { + IdUserRole = 2002, + IdPermission = 246 + }, + new + { + IdUserRole = 2002, + IdPermission = 237 + }, + new + { + IdUserRole = 2002, + IdPermission = 238 + }, + new + { + IdUserRole = 2003, + IdPermission = 240 + }, + new + { + IdUserRole = 2003, + IdPermission = 217 + }, + new + { + IdUserRole = 2003, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 242 + }, + new + { + IdUserRole = 2004, + IdPermission = 217 + }, + new + { + IdUserRole = 2004, + IdPermission = 216 + }, + new + { + IdUserRole = 2004, + IdPermission = 205 + }, + new + { + IdUserRole = 2004, + IdPermission = 204 + }, + new + { + IdUserRole = 2005, + IdPermission = 247 + }, + new + { + IdUserRole = 2005, + IdPermission = 205 + }, + new + { + IdUserRole = 2005, + IdPermission = 204 + }, + new + { + IdUserRole = 2006, + IdPermission = 243 + }, + new + { + IdUserRole = 2006, + IdPermission = 205 + }, + new + { + IdUserRole = 2006, + IdPermission = 204 + }, + new + { + IdUserRole = 2007, + IdPermission = 241 + }, + new + { + IdUserRole = 2007, + IdPermission = 205 + }, + new + { + IdUserRole = 2007, + IdPermission = 204 + }, + new + { + IdUserRole = 1, + IdPermission = 500 + }, + new + { + IdUserRole = 1, + IdPermission = 501 + }, + new + { + IdUserRole = 1, + IdPermission = 502 + }, + new + { + IdUserRole = 1, + IdPermission = 503 + }, + new + { + IdUserRole = 1, + IdPermission = 504 + }, + new + { + IdUserRole = 1, + IdPermission = 505 + }, + new + { + IdUserRole = 1, + IdPermission = 506 + }, + new + { + IdUserRole = 1, + IdPermission = 510 + }, + new + { + IdUserRole = 1, + IdPermission = 511 + }, + new + { + IdUserRole = 1, + IdPermission = 512 + }); + }); + + 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("Отношение ролей к ролям"); + + b.HasData( + new + { + Id = 1101, + IdInclude = 1100 + }, + new + { + Id = 1103, + IdInclude = 1102 + }, + new + { + Id = 1105, + IdInclude = 1104 + }, + new + { + Id = 1107, + IdInclude = 1106 + }, + new + { + Id = 1109, + IdInclude = 1108 + }, + new + { + Id = 1111, + IdInclude = 1110 + }, + new + { + Id = 1114, + IdInclude = 1113 + }, + new + { + Id = 1117, + IdInclude = 1116 + }, + new + { + Id = 1203, + IdInclude = 1202 + }, + new + { + Id = 1207, + IdInclude = 1206 + }, + new + { + Id = 1209, + IdInclude = 1208 + }, + new + { + Id = 1212, + IdInclude = 1211 + }, + new + { + Id = 1214, + IdInclude = 1213 + }, + new + { + Id = 1216, + IdInclude = 1215 + }, + new + { + Id = 1218, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1200 + }, + new + { + Id = 2000, + IdInclude = 1201 + }, + new + { + Id = 2000, + IdInclude = 1202 + }, + new + { + Id = 2000, + IdInclude = 1204 + }, + new + { + Id = 2000, + IdInclude = 1205 + }, + new + { + Id = 2000, + IdInclude = 1206 + }, + new + { + Id = 2000, + IdInclude = 1208 + }, + new + { + Id = 2000, + IdInclude = 1210 + }, + new + { + Id = 2000, + IdInclude = 1211 + }, + new + { + Id = 2000, + IdInclude = 1213 + }, + new + { + Id = 2000, + IdInclude = 1215 + }, + new + { + Id = 2000, + IdInclude = 1217 + }, + new + { + Id = 2000, + IdInclude = 1219 + }, + new + { + Id = 2000, + IdInclude = 1220 + }, + new + { + Id = 2000, + IdInclude = 1221 + }, + new + { + Id = 2000, + IdInclude = 1500 + }, + new + { + Id = 2000, + IdInclude = 1501 + }, + new + { + Id = 2000, + IdInclude = 1502 + }, + new + { + Id = 2001, + IdInclude = 1500 + }, + new + { + Id = 2001, + IdInclude = 1501 + }, + new + { + Id = 2001, + IdInclude = 1502 + }, + new + { + Id = 2002, + IdInclude = 1500 + }, + new + { + Id = 2002, + IdInclude = 1501 + }, + new + { + Id = 2002, + IdInclude = 1502 + }, + new + { + Id = 2003, + IdInclude = 1500 + }, + new + { + Id = 2003, + IdInclude = 1501 + }, + new + { + Id = 2003, + IdInclude = 1502 + }, + new + { + Id = 2004, + IdInclude = 1500 + }, + new + { + Id = 2004, + IdInclude = 1501 + }, + new + { + Id = 2004, + IdInclude = 1502 + }, + new + { + Id = 2005, + IdInclude = 1500 + }, + new + { + Id = 2005, + IdInclude = 1501 + }, + new + { + Id = 2005, + IdInclude = 1502 + }, + new + { + Id = 2006, + IdInclude = 1500 + }, + new + { + Id = 2006, + IdInclude = 1501 + }, + new + { + Id = 2006, + IdInclude = 1502 + }, + new + { + Id = 2007, + IdInclude = 1500 + }, + new + { + Id = 2007, + IdInclude = 1501 + }, + new + { + Id = 2007, + IdInclude = 1502 + }); + }); + + 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 = 1 + }); + }); + + 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.Schedule", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id") + .HasComment("Идентификатор"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DrillEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_end") + .HasComment("Конец вахты"); + + b.Property("DrillStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("drill_start") + .HasComment("Начало вахты"); + + b.Property("IdDriller") + .HasColumnType("integer") + .HasColumnName("id_driller") + .HasComment("Идентификатор бурильщика"); + + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well") + .HasComment("Идентификатор скважины"); + + b.Property("ShiftEnd") + .HasColumnType("time without time zone") + .HasColumnName("shift_end") + .HasComment("Конец смены"); + + b.Property("ShiftStart") + .HasColumnType("time without time zone") + .HasColumnName("shift_start") + .HasComment("Начало смены"); + + b.HasKey("Id"); + + b.HasIndex("IdDriller"); + + b.HasIndex("IdWell"); + + b.ToTable("t_schedule"); + + 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.Subsystems.Subsystem", 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"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("name"); + + b.HasKey("Id"); + + b.ToTable("t_subsystem"); + + b.HasComment("Описание подсистем"); + + b.HasData( + new + { + Id = 1, + Description = "Совместная работа режимов \"Бурение в роторе\" и \"Бурение в слайде\"", + Name = "АКБ" + }, + new + { + Id = 2, + Description = "Алгоритм поиска оптимальных параметров бурения САУБ", + Name = "MSE" + }, + new + { + Id = 65536, + Description = "Spin master", + Name = "Spin master" + }, + new + { + Id = 65537, + Description = "Torque master", + Name = "Torque master" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.Subsystems.SubsystemOperationTime", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("DateEnd") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_end") + .HasComment("дата/время выключения подсистемы"); + + b.Property("DateStart") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_start") + .HasComment("дата/время включения подсистемы"); + + b.Property("DepthEnd") + .HasColumnType("real") + .HasColumnName("depth_end") + .HasComment("глубина забоя на момент выключения подсистемы"); + + b.Property("DepthStart") + .HasColumnType("real") + .HasColumnName("depth_start") + .HasComment("глубина забоя на момент включения подсистемы"); + + b.Property("IdSubsystem") + .HasColumnType("integer") + .HasColumnName("id_subsystem"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("ИД телеметрии по которой выдается информация"); + + b.HasKey("Id"); + + b.HasIndex("IdSubsystem"); + + b.HasIndex("IdTelemetry"); + + b.ToTable("t_subsystem_operation_time"); + + 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.TelemetryDataSaub", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .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("Mse") + .HasColumnType("real") + .HasColumnName("mse") + .HasComment("MSE"); + + 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", "DateTime"); + + b.ToTable("t_telemetry_data_saub"); + + b.HasComment("набор основных данных по SAUB"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSaubStat", b => + { + b.Property("Count") + .HasColumnType("bigint") + .HasColumnName("count_items"); + + b.Property("DateMax") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_max"); + + b.Property("DateMin") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_min"); + + b.Property("DepthMax") + .HasColumnType("real") + .HasColumnName("depth_max"); + + b.Property("DepthMin") + .HasColumnType("real") + .HasColumnName("depth_min"); + + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.ToView("mw_telemetry_datas_saub_stat"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.TelemetryDataSpin", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date") + .HasComment("'2021-10-19 18:23:54+05'"); + + b.Property("Mode") + .HasColumnType("smallint") + .HasColumnName("mode") + .HasComment("Выбранный режим управления"); + + b.Property("PositionRight") + .HasColumnType("real") + .HasColumnName("position_right") + .HasComment("Крайний правый угол осцилляции"); + + b.Property("PositionZero") + .HasColumnType("real") + .HasColumnName("position_zero") + .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("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.HasKey("IdTelemetry", "DateTime"); + + 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("DateTime") + .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.TelemetryWirelineRunOut", b => + { + b.Property("IdTelemetry") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id_telemetry") + .HasComment("Идентификатор телеметрии"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("IdTelemetry")); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date_time") + .HasComment("Отметка времени"); + + b.Property("Hauling") + .HasColumnType("real") + .HasColumnName("hauling") + .HasComment("Наработка талевого каната с момента перетяжки каната, т*км"); + + b.Property("HaulingWarnSp") + .HasColumnType("real") + .HasColumnName("hauling_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости перетяжки, т*км"); + + b.Property("Replace") + .HasColumnType("real") + .HasColumnName("replace") + .HasComment("Наработка талевого каната с момента замены каната, т*км"); + + b.Property("ReplaceWarnSp") + .HasColumnType("real") + .HasColumnName("replace_warn_sp") + .HasComment("Наработка талевого каната до сигнализации о необходимости замены, т*км"); + + b.HasKey("IdTelemetry"); + + b.ToTable("t_telemetry_wireline_run_out"); + + 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 = "root", + IdType = 1 + }, + new + { + Id = 1100, + Caption = "admin_cluster.view", + IdType = 1 + }, + new + { + Id = 1101, + Caption = "admin_cluster.edit", + IdType = 1 + }, + new + { + Id = 1102, + Caption = "admin_company.view", + IdType = 1 + }, + new + { + Id = 1103, + Caption = "admin_company.edit", + IdType = 1 + }, + new + { + Id = 1104, + Caption = "admin_company_type.view", + IdType = 1 + }, + new + { + Id = 1105, + Caption = "admin_company_type.edit", + IdType = 1 + }, + new + { + Id = 1106, + Caption = "admin_deposit.view", + IdType = 1 + }, + new + { + Id = 1107, + Caption = "admin_deposit.edit", + IdType = 1 + }, + new + { + Id = 1108, + Caption = "admin_permission.view", + IdType = 1 + }, + new + { + Id = 1109, + Caption = "admin_permission.edit", + IdType = 1 + }, + new + { + Id = 1110, + Caption = "admin_role.view", + IdType = 1 + }, + new + { + Id = 1111, + Caption = "admin_role.edit", + IdType = 1 + }, + new + { + Id = 1112, + Caption = "admin_telemetry.view", + IdType = 1 + }, + new + { + Id = 1113, + Caption = "admin_user.view", + IdType = 1 + }, + new + { + Id = 1114, + Caption = "admin_user.edit", + IdType = 1 + }, + new + { + Id = 1115, + Caption = "admin_visit_log.view", + IdType = 1 + }, + new + { + Id = 1116, + Caption = "admin_well.view", + IdType = 1 + }, + new + { + Id = 1117, + Caption = "admin_well.edit", + IdType = 1 + }, + new + { + Id = 1200, + Caption = "archive.view", + IdType = 1 + }, + new + { + Id = 1201, + Caption = "cluster.view", + IdType = 1 + }, + new + { + Id = 1202, + Caption = "composite.view", + IdType = 1 + }, + new + { + Id = 1203, + Caption = "composite.edit", + IdType = 1 + }, + new + { + Id = 1204, + Caption = "deposit.view", + IdType = 1 + }, + new + { + Id = 1205, + Caption = "document.view", + IdType = 1 + }, + new + { + Id = 1206, + Caption = "drillProcessFlow.view", + IdType = 1 + }, + new + { + Id = 1207, + Caption = "drillProcessFlow.edit", + IdType = 1 + }, + new + { + Id = 1208, + Caption = "measure.view", + IdType = 1 + }, + new + { + Id = 1209, + Caption = "measure.edit", + IdType = 1 + }, + new + { + Id = 1210, + Caption = "message.view", + IdType = 1 + }, + new + { + Id = 1211, + Caption = "operations.view", + IdType = 1 + }, + new + { + Id = 1212, + Caption = "operations.edit", + IdType = 1 + }, + new + { + Id = 1213, + Caption = "params.view", + IdType = 1 + }, + new + { + Id = 1214, + Caption = "params.edit", + IdType = 1 + }, + new + { + Id = 1215, + Caption = "report.view", + IdType = 1 + }, + new + { + Id = 1216, + Caption = "report.edit", + IdType = 1 + }, + new + { + Id = 1217, + Caption = "setpoints.view", + IdType = 1 + }, + new + { + Id = 1218, + Caption = "setpoints.edit", + IdType = 1 + }, + new + { + Id = 1219, + Caption = "telemetry.view", + IdType = 1 + }, + new + { + Id = 1220, + Caption = "telemetryAnalysis.view", + IdType = 1 + }, + new + { + Id = 1221, + Caption = "well.view", + IdType = 1 + }, + new + { + Id = 1500, + Caption = "Просмотр всего", + IdType = 1 + }, + new + { + Id = 1501, + Caption = "file.edit", + IdType = 1 + }, + new + { + Id = 1502, + Caption = "drillingProgram.edit", + IdType = 1 + }, + new + { + Id = 2000, + Caption = "Заказчик", + IdType = 0 + }, + new + { + Id = 2001, + Caption = "Супервайзер", + IdType = 0 + }, + new + { + Id = 2002, + Caption = "Буровой подрядчик", + IdType = 0 + }, + new + { + Id = 2003, + Caption = "Растворщик", + IdType = 0 + }, + new + { + Id = 2004, + Caption = "Телеметрист", + IdType = 0 + }, + new + { + Id = 2005, + Caption = "Долотный сервис", + IdType = 0 + }, + new + { + Id = 2006, + Caption = "ГТИ", + IdType = 0 + }, + new + { + Id = 2007, + Caption = "Цементирование", + IdType = 0 + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.UserSetting", b => + { + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("Key") + .HasMaxLength(255) + .HasColumnType("character varying(255)") + .HasColumnName("key") + .HasComment("Ключ настроек пользователя"); + + b.Property("Value") + .HasColumnType("jsonb") + .HasColumnName("setting_value") + .HasComment("Значение настроек пользователя"); + + b.HasKey("IdUser", "Key"); + + b.ToTable("t_user_settings"); + + b.HasComment("настройки интерфейса пользователя"); + }); + + 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.WellFinalDocument", b => + { + b.Property("IdWell") + .HasColumnType("integer") + .HasColumnName("id_well"); + + b.Property("IdUser") + .HasColumnType("integer") + .HasColumnName("id_user"); + + b.Property("IdCategory") + .HasColumnType("integer") + .HasColumnName("id_category"); + + b.HasKey("IdWell", "IdUser", "IdCategory") + .HasName("t_well_final_documents_pk"); + + b.HasIndex("IdCategory"); + + b.HasIndex("IdUser"); + + b.ToTable("t_well_final_documents"); + + 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("IdParent") + .HasColumnType("integer") + .HasColumnName("id_parent") + .HasComment("id родительской категории"); + + b.Property("KeyValueName") + .HasMaxLength(32) + .HasColumnType("character varying(32)") + .HasColumnName("key_value_name") + .HasComment("Название ключевого показателя операции"); + + b.Property("KeyValueUnits") + .HasMaxLength(16) + .HasColumnType("character varying(16)") + .HasColumnName("key_value_units") + .HasComment("Единицы измерения ключевого показателя операции"); + + b.Property("Name") + .IsRequired() + .HasColumnType("text") + .HasColumnName("name") + .HasComment("Название категории операции"); + + b.HasKey("Id"); + + b.HasIndex("IdParent"); + + b.ToTable("t_well_operation_category"); + + b.HasComment("Справочник операций на скважине"); + + b.HasData( + new + { + Id = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "БУРЕНИЕ" + }, + new + { + Id = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КРЕПЛЕНИЕ" + }, + new + { + Id = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГФР" + }, + new + { + Id = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные операции" + }, + new + { + Id = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Непроизводительное время (НПВ)" + }, + new + { + Id = 4000, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "КНБК" + }, + new + { + Id = 4001, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "м/ч", + Name = "Механическое. бурение" + }, + new + { + Id = 4002, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Статический замер" + }, + new + { + Id = 4003, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Нормализация диаметра скважины" + }, + new + { + Id = 4004, + IdParent = 3000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 4005, + IdParent = 3001, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4006, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск обсадной колонны" + }, + new + { + Id = 4007, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 4008, + IdParent = 3002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы при креплении" + }, + new + { + Id = 4009, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка/разборка приборов ГИС" + }, + new + { + Id = 4010, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО" + }, + new + { + Id = 4011, + IdParent = 3003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ГИС" + }, + new + { + Id = 4012, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка, ОБР" + }, + new + { + Id = 4013, + IdParent = 3004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Вспомогательные работы" + }, + new + { + Id = 4014, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт оборудования" + }, + new + { + Id = 4015, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Аварийные работы" + }, + new + { + Id = 4016, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Осложнение" + }, + new + { + Id = 4017, + IdParent = 3005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Незаложенные в ГГД операции" + }, + new + { + Id = 5000, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка КНБК" + }, + new + { + Id = 5001, + IdParent = 4000, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка КНБК" + }, + new + { + Id = 5002, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Направленно (СЛАЙД)" + }, + new + { + Id = 5003, + IdParent = 4001, + KeyValueName = "МСП", + KeyValueUnits = "м/ч", + Name = "Ротором (РУС)" + }, + new + { + Id = 5004, + IdParent = 4002, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Замер ЗТС (запись MWD)" + }, + new + { + Id = 5005, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка перед наращиванием" + }, + new + { + Id = 5006, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка во время бурения" + }, + new + { + Id = 5007, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Проработка перед наращиванием" + }, + new + { + Id = 5008, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка во время бурения" + }, + new + { + Id = 5009, + IdParent = 4003, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Шаблонировка перед наращиванием" + }, + new + { + Id = 5010, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наращивание" + }, + new + { + Id = 5011, + IdParent = 4004, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Удержание в клиньях" + }, + new + { + Id = 5012, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем инструмента" + }, + new + { + Id = 5013, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем КНБК" + }, + new + { + Id = 5014, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента" + }, + new + { + Id = 5015, + IdParent = 4005, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск КНБК" + }, + new + { + Id = 5016, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка при спуске ОК" + }, + new + { + Id = 5017, + IdParent = 4006, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск ОК" + }, + new + { + Id = 5018, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ОЗЦ" + }, + new + { + Id = 5019, + IdParent = 4007, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Цементирование" + }, + new + { + Id = 5020, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка БИ" + }, + new + { + Id = 5021, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ОК" + }, + new + { + Id = 5022, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при спуске ОК" + }, + new + { + Id = 5023, + IdParent = 4008, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при цементировании" + }, + new + { + Id = 5024, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разборка комплекса приборов ГИС" + }, + new + { + Id = 5025, + IdParent = 4009, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сборка комплекса приборов ГИС" + }, + new + { + Id = 5026, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Подъем приборов ГИС (на трубах)" + }, + new + { + Id = 5027, + IdParent = 4010, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск приборов ГИС (на трубах)" + }, + new + { + Id = 5028, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на жестком кабеле" + }, + new + { + Id = 5029, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на кабеле" + }, + new + { + Id = 5030, + IdParent = 4011, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Комплекс ГИС на трубах" + }, + new + { + Id = 5031, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Закачка/прокачка пачки" + }, + new + { + Id = 5032, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка БР" + }, + new + { + Id = 5033, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ориентирование ТС при бурении" + }, + new + { + Id = 5034, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перезапись гаммы-каротажа" + }, + new + { + Id = 5035, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Приготовление БР" + }, + new + { + Id = 5036, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Промывка" + }, + new + { + Id = 5037, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Разбуривание тех.оснастки" + }, + new + { + Id = 5038, + IdParent = 4012, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Спуск инструмента с проработкой" + }, + new + { + Id = 5039, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ВМР" + }, + new + { + Id = 5040, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Демонтаж ПВО" + }, + new + { + Id = 5041, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Долив затруба при подъёме" + }, + new + { + Id = 5042, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Монтаж ПВО" + }, + new + { + Id = 5043, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Наработка жёлоба" + }, + new + { + Id = 5044, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обвязка устья с циркуляционной системой" + }, + new + { + Id = 5045, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Оборудование устья" + }, + new + { + Id = 5046, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Опрессовка ПВО" + }, + new + { + Id = 5047, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перемонтаж ПВО " + }, + new + { + Id = 5048, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Перетяжка талевого каната" + }, + new + { + Id = 5049, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПЗР при сборке КНБК" + }, + new + { + Id = 5050, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Полная замена талевого каната" + }, + new + { + Id = 5051, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "ПР перед забуркой направления" + }, + new + { + Id = 5052, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Продувка манифольда" + }, + new + { + Id = 5053, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Срезка" + }, + new + { + Id = 5054, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тайм-дриллинг" + }, + new + { + Id = 5055, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Тех.отстой" + }, + new + { + Id = 5056, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Учебная тревога \"Выброс\"" + }, + new + { + Id = 5057, + IdParent = 4013, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Чистка ЦСГО/емкостного блока" + }, + new + { + Id = 5058, + IdParent = 4014, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ремонт бурового оборудования" + }, + new + { + Id = 5059, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ловильные работы" + }, + new + { + Id = 5060, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ожидание" + }, + new + { + Id = 5061, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Определение места прихвата и ЛМ" + }, + new + { + Id = 5062, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Работа яссом" + }, + new + { + Id = 5063, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Расхаживание" + }, + new + { + Id = 5064, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - колокол" + }, + new + { + Id = 5065, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - метчик" + }, + new + { + Id = 5066, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - овершот" + }, + new + { + Id = 5067, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "СПО - труболовка" + }, + new + { + Id = 5068, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (встряхивание)" + }, + new + { + Id = 5069, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Торпедирование (отстрел)" + }, + new + { + Id = 5070, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Установка ванн" + }, + new + { + Id = 5071, + IdParent = 4015, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Фрезеровка" + }, + new + { + Id = 5072, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Контролируемое ГНВП" + }, + new + { + Id = 5073, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Поглощение" + }, + new + { + Id = 5074, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Сальникообразование" + }, + new + { + Id = 5075, + IdParent = 4016, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Утяжеление БР" + }, + new + { + Id = 5076, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "НПВ / прочее" + }, + new + { + Id = 5077, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Обработка раствора (несоответствие параметров)" + }, + new + { + Id = 5078, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "подъем ОК" + }, + new + { + Id = 5079, + IdParent = 4017, + KeyValueName = "dT", + KeyValueUnits = "мин", + Name = "Ревизия КНБК/инструмента/ЗТС" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .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" + }, + new + { + Id = 31, + Caption = "Техническая колонна" + }, + new + { + Id = 32, + Caption = "Техническая колонна 2" + }, + new + { + Id = 33, + Caption = "Техническая колонна 3" + }); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellType", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("Caption") + .IsRequired() + .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.WITS.RecordBase", b => + { + b.Property("IdTelemetry") + .HasColumnType("integer") + .HasColumnName("id_telemetry"); + + b.Property("DateTime") + .HasColumnType("timestamp with time zone") + .HasColumnName("date"); + + b.Property("Actcod") + .HasColumnType("smallint") + .HasColumnName("ACTCOD"); + + b.Property("Date") + .HasColumnType("integer") + .HasColumnName("DATE"); + + b.Property("Recid") + .HasColumnType("smallint") + .HasColumnName("RECID"); + + b.Property("Seqid") + .HasColumnType("integer") + .HasColumnName("SEQID"); + + b.Property("Stknum") + .HasColumnType("smallint") + .HasColumnName("STKNUM"); + + b.Property("Time") + .HasColumnType("integer") + .HasColumnName("TIME"); + + b.Property("Wellid") + .HasColumnType("text") + .HasColumnName("WELLID"); + + b.HasKey("IdTelemetry", "DateTime"); + + b.ToTable("t_telemetry_wits_base"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Blkpos") + .HasColumnType("real") + .HasColumnName("BLKPOS"); + + b.Property("Chkp") + .HasColumnType("real") + .HasColumnName("CHKP"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptretm") + .HasColumnType("real") + .HasColumnName("DEPTRETM"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Gasa") + .HasColumnType("real") + .HasColumnName("GASA"); + + b.Property("Hkla") + .HasColumnType("real") + .HasColumnName("HKLA"); + + b.Property("Hklx") + .HasColumnType("real") + .HasColumnName("HKLX"); + + b.Property("Lagstks") + .HasColumnType("smallint") + .HasColumnName("LAGSTKS"); + + b.Property("Mcia") + .HasColumnType("real") + .HasColumnName("MCIA"); + + b.Property("Mcoa") + .HasColumnType("real") + .HasColumnName("MCOA"); + + b.Property("Mdia") + .HasColumnType("real") + .HasColumnName("MDIA"); + + b.Property("Mdoa") + .HasColumnType("real") + .HasColumnName("MDOA"); + + b.Property("Mfia") + .HasColumnType("real") + .HasColumnName("MFIA"); + + b.Property("Mfoa") + .HasColumnType("real") + .HasColumnName("MFOA"); + + b.Property("Mfop") + .HasColumnType("smallint") + .HasColumnName("MFOP"); + + b.Property("Mtia") + .HasColumnType("real") + .HasColumnName("MTIA"); + + b.Property("Mtoa") + .HasColumnType("real") + .HasColumnName("MTOA"); + + b.Property("Ropa") + .HasColumnType("real") + .HasColumnName("ROPA"); + + b.Property("Rpma") + .HasColumnType("smallint") + .HasColumnName("RPMA"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spm1") + .HasColumnType("smallint") + .HasColumnName("SPM1"); + + b.Property("Spm2") + .HasColumnType("smallint") + .HasColumnName("SPM2"); + + b.Property("Spm3") + .HasColumnType("smallint") + .HasColumnName("SPM3"); + + b.Property("Sppa") + .HasColumnType("real") + .HasColumnName("SPPA"); + + b.Property("Stkc") + .HasColumnType("integer") + .HasColumnName("STKC"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.Property("Torqa") + .HasColumnType("real") + .HasColumnName("TORQA"); + + b.Property("Torqx") + .HasColumnType("real") + .HasColumnName("TORQX"); + + b.Property("Tvolact") + .HasColumnType("real") + .HasColumnName("TVOLACT"); + + b.Property("Tvolcact") + .HasColumnType("real") + .HasColumnName("TVOLCACT"); + + b.Property("Woba") + .HasColumnType("real") + .HasColumnName("WOBA"); + + b.Property("Wobx") + .HasColumnType("real") + .HasColumnName("WOBX"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_1"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("DeptmeasGdpMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_GDP_mc"); + + b.Property("DeptmeasMcrstat") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_MCRSTAT"); + + b.Property("DeptmeasRa33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33_mc"); + + b.Property("DeptmeasRa33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F2_mc"); + + b.Property("DeptmeasRa33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RA33F4_mc"); + + b.Property("DeptmeasRp33Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33_mc"); + + b.Property("DeptmeasRp33f2Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F2_mc"); + + b.Property("DeptmeasRp33f4Mc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_RP33F4_mc"); + + b.Property("DeptmeasSlvlMc") + .HasColumnType("real") + .HasColumnName("DEPTMEAS_SLVL_mc"); + + b.Property("GdpMc") + .HasColumnType("real") + .HasColumnName("GDP_mc"); + + b.Property("Mcrstat") + .HasColumnType("real") + .HasColumnName("MCRSTAT"); + + b.Property("Ra33Mc") + .HasColumnType("real") + .HasColumnName("RA33_mc"); + + b.Property("Ra33f2Mc") + .HasColumnType("real") + .HasColumnName("RA33F2_mc"); + + b.Property("Ra33f4Mc") + .HasColumnType("real") + .HasColumnName("RA33F4_mc"); + + b.Property("Rp33Mc") + .HasColumnType("real") + .HasColumnName("RP33_mc"); + + b.Property("Rp33f2Mc") + .HasColumnType("real") + .HasColumnName("RP33F2_mc"); + + b.Property("Rp33f4Mc") + .HasColumnType("real") + .HasColumnName("RP33F4_mc"); + + b.Property("SlvlMc") + .HasColumnType("real") + .HasColumnName("SLVL_mc"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_50"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Btot") + .HasColumnType("real") + .HasColumnName("Btot"); + + b.Property("Bx") + .HasColumnType("real") + .HasColumnName("Bx"); + + b.Property("By") + .HasColumnType("real") + .HasColumnName("By"); + + b.Property("Bz") + .HasColumnType("real") + .HasColumnName("Bz"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Gtot") + .HasColumnType("real") + .HasColumnName("Gtot"); + + b.Property("Gx") + .HasColumnType("real") + .HasColumnName("Gx"); + + b.Property("Gy") + .HasColumnType("real") + .HasColumnName("Gy"); + + b.Property("Gz") + .HasColumnType("real") + .HasColumnName("Gz"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_60"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Att06h") + .HasColumnType("real") + .HasColumnName("ATT06H"); + + b.Property("Att06l") + .HasColumnType("real") + .HasColumnName("ATT06L"); + + b.Property("Att10h") + .HasColumnType("real") + .HasColumnName("ATT10H"); + + b.Property("Att10l") + .HasColumnType("real") + .HasColumnName("ATT10L"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Phl1f1") + .HasColumnType("real") + .HasColumnName("PHL1F1"); + + b.Property("Phl1f2") + .HasColumnType("real") + .HasColumnName("PHL1F2"); + + b.Property("Phl2f1") + .HasColumnType("real") + .HasColumnName("PHL2F1"); + + b.Property("Phl2f2") + .HasColumnType("real") + .HasColumnName("PHL2F2"); + + b.Property("Status") + .HasColumnType("real") + .HasColumnName("Status"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_61"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptsvym") + .HasColumnType("real") + .HasColumnName("DEPTSVYM"); + + b.Property("Deptsvyv") + .HasColumnType("real") + .HasColumnName("DEPTSVYV"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Svyazc") + .HasColumnType("real") + .HasColumnName("SVYAZC"); + + b.Property("Svyazu") + .HasColumnType("real") + .HasColumnName("SVYAZU"); + + b.Property("Svydls") + .HasColumnType("real") + .HasColumnName("SVYDLS"); + + b.Property("Svyew") + .HasColumnType("real") + .HasColumnName("SVYEW"); + + b.Property("Svygtf") + .HasColumnType("real") + .HasColumnName("SVYGTF"); + + b.Property("Svyinc") + .HasColumnType("real") + .HasColumnName("SVYINC"); + + b.Property("Svymtf") + .HasColumnType("real") + .HasColumnName("SVYMTF"); + + b.Property("Svyns") + .HasColumnType("real") + .HasColumnName("SVYNS"); + + b.Property("Svytype") + .HasColumnType("text") + .HasColumnName("SVYTYPE"); + + b.Property("Svywalk") + .HasColumnType("real") + .HasColumnName("SVYWALK"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_7"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasBaseType("AsbCloudDb.Model.WITS.RecordBase"); + + b.Property("Deptbitm") + .HasColumnType("real") + .HasColumnName("DEPTBITM"); + + b.Property("Deptbitv") + .HasColumnType("real") + .HasColumnName("DEPTBITV"); + + b.Property("Deptcalm") + .HasColumnType("real") + .HasColumnName("DEPTCALM"); + + b.Property("Deptcalv") + .HasColumnType("real") + .HasColumnName("DEPTCALV"); + + b.Property("Deptfdm") + .HasColumnType("real") + .HasColumnName("DEPTFDM"); + + b.Property("Deptfdv") + .HasColumnType("real") + .HasColumnName("DEPTFDV"); + + b.Property("Deptgr1m") + .HasColumnType("real") + .HasColumnName("DEPTGR1M"); + + b.Property("Deptgr1v") + .HasColumnType("real") + .HasColumnName("DEPTGR1V"); + + b.Property("Deptgr2m") + .HasColumnType("real") + .HasColumnName("DEPTGR2M"); + + b.Property("Deptgr2v") + .HasColumnType("real") + .HasColumnName("DEPTGR2V"); + + b.Property("Deptmeas") + .HasColumnType("real") + .HasColumnName("DEPTMEAS"); + + b.Property("Deptp1m") + .HasColumnType("real") + .HasColumnName("DEPTP1M"); + + b.Property("Deptp1v") + .HasColumnType("real") + .HasColumnName("DEPTP1V"); + + b.Property("Deptp2m") + .HasColumnType("real") + .HasColumnName("DEPTP2M"); + + b.Property("Deptp2v") + .HasColumnType("real") + .HasColumnName("DEPTP2V"); + + b.Property("Deptrs1m") + .HasColumnType("real") + .HasColumnName("DEPTRS1M"); + + b.Property("Deptrs1v") + .HasColumnType("real") + .HasColumnName("DEPTRS1V"); + + b.Property("Deptrs2m") + .HasColumnType("real") + .HasColumnName("DEPTRS2M"); + + b.Property("Deptrs2v") + .HasColumnType("real") + .HasColumnName("DEPTRS2V"); + + b.Property("Deptvert") + .HasColumnType("real") + .HasColumnName("DEPTVERT"); + + b.Property("Mclp") + .HasColumnType("real") + .HasColumnName("MCLP"); + + b.Property("Mfd") + .HasColumnType("real") + .HasColumnName("MFD"); + + b.Property("Mffp") + .HasColumnType("real") + .HasColumnName("MFFP"); + + b.Property("Mfpp") + .HasColumnType("real") + .HasColumnName("MFPP"); + + b.Property("Mfrann") + .HasColumnType("real") + .HasColumnName("MFRANN"); + + b.Property("Mfrpipe") + .HasColumnType("real") + .HasColumnName("MFRPIPE"); + + b.Property("Mftann") + .HasColumnType("real") + .HasColumnName("MFTANN"); + + b.Property("Mftpipe") + .HasColumnType("real") + .HasColumnName("MFTPIPE"); + + b.Property("Mg1") + .HasColumnType("real") + .HasColumnName("MG1"); + + b.Property("Mg1c") + .HasColumnType("real") + .HasColumnName("MG1C"); + + b.Property("Mg2") + .HasColumnType("real") + .HasColumnName("MG2"); + + b.Property("Mg2c") + .HasColumnType("real") + .HasColumnName("MG2C"); + + b.Property("Mpo1") + .HasColumnType("real") + .HasColumnName("MPO1"); + + b.Property("Mpo2") + .HasColumnType("real") + .HasColumnName("MPO2"); + + b.Property("Mr1") + .HasColumnType("real") + .HasColumnName("MR1"); + + b.Property("Mr1c") + .HasColumnType("real") + .HasColumnName("MR1C"); + + b.Property("Mr2") + .HasColumnType("real") + .HasColumnName("MR2"); + + b.Property("Mr2c") + .HasColumnType("real") + .HasColumnName("MR2C"); + + b.Property("Passnum") + .HasColumnType("smallint") + .HasColumnName("PASSNUM"); + + b.Property("Spare1") + .HasColumnType("real") + .HasColumnName("SPARE1"); + + b.Property("Spare2") + .HasColumnType("real") + .HasColumnName("SPARE2"); + + b.Property("Spare3") + .HasColumnType("real") + .HasColumnName("SPARE3"); + + b.Property("Spare4") + .HasColumnType("real") + .HasColumnName("SPARE4"); + + b.Property("Spare5") + .HasColumnType("real") + .HasColumnName("SPARE5"); + + b.Property("Spare6") + .HasColumnType("real") + .HasColumnName("SPARE6"); + + b.Property("Spare7") + .HasColumnType("real") + .HasColumnName("SPARE7"); + + b.Property("Spare8") + .HasColumnType("real") + .HasColumnName("SPARE8"); + + b.Property("Spare9") + .HasColumnType("real") + .HasColumnName("SPARE9"); + + b.Property("TelemetryId") + .HasColumnType("integer"); + + b.HasIndex("TelemetryId"); + + b.ToTable("t_telemetry_wits_8"); + }); + + 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.DailyReport.DailyReport", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DetectedOperation", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "FileCategory") + .WithMany() + .HasForeignKey("IdFileCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany("DrillingProgramParts") + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("FileCategory"); + + b.Navigation("Well"); + }); + + 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.LimitingParameter", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + 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.OperationValue", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory") + .WithMany() + .HasForeignKey("IdOperationCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("OperationCategory"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.PlannedTrajectory", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.ProcessMap", b => + { + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.WellSectionType", "WellSectionType") + .WithMany() + .HasForeignKey("IdWellSectionType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Well"); + + b.Navigation("WellSectionType"); + }); + + 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.RelationUserDrillingProgramPart", b => + { + b.HasOne("AsbCloudDb.Model.DrillingProgramPart", "DrillingProgramPart") + .WithMany("RelatedUsers") + .HasForeignKey("IdDrillingProgramPart") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("DrillingProgramPart"); + + b.Navigation("User"); + }); + + 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.Schedule", b => + { + b.HasOne("AsbCloudDb.Model.Driller", "Driller") + .WithMany("Schedule") + .HasForeignKey("IdDriller") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("t_schedule_t_driller_id_driller"); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Driller"); + + 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.Subsystems.SubsystemOperationTime", b => + { + b.HasOne("AsbCloudDb.Model.Subsystems.Subsystem", "Subsystem") + .WithMany() + .HasForeignKey("IdSubsystem") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("IdTelemetry") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Subsystem"); + + 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.UserSetting", b => + { + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("User"); + }); + + 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.WellFinalDocument", b => + { + b.HasOne("AsbCloudDb.Model.FileCategory", "Category") + .WithMany() + .HasForeignKey("IdCategory") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.User", "User") + .WithMany() + .HasForeignKey("IdUser") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("AsbCloudDb.Model.Well", "Well") + .WithMany() + .HasForeignKey("IdWell") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Category"); + + b.Navigation("User"); + + b.Navigation("Well"); + }); + + 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.WellOperationCategory", b => + { + b.HasOne("AsbCloudDb.Model.WellOperationCategory", "Parent") + .WithMany() + .HasForeignKey("IdParent"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record1", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record1", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record50", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record50", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record60", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record60", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record61", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record61", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record7", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record7", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WITS.Record8", b => + { + b.HasOne("AsbCloudDb.Model.Telemetry", "Telemetry") + .WithMany() + .HasForeignKey("TelemetryId"); + + b.HasOne("AsbCloudDb.Model.WITS.RecordBase", null) + .WithOne() + .HasForeignKey("AsbCloudDb.Model.WITS.Record8", "IdTelemetry", "DateTime") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Telemetry"); + }); + + 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.Driller", b => + { + b.Navigation("Schedule"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.DrillingProgramPart", b => + { + b.Navigation("RelatedUsers"); + }); + + 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("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("DrillingProgramParts"); + + b.Navigation("RelationCompaniesWells"); + + b.Navigation("WellCompositeSrcs"); + + b.Navigation("WellComposites"); + + b.Navigation("WellOperations"); + }); + + modelBuilder.Entity("AsbCloudDb.Model.WellSectionType", b => + { + 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/20230203040530_Add_permissions_for_ProcessMap.cs b/AsbCloudDb/Migrations/20230203040530_Add_permissions_for_ProcessMap.cs new file mode 100644 index 00000000..913fb232 --- /dev/null +++ b/AsbCloudDb/Migrations/20230203040530_Add_permissions_for_ProcessMap.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace AsbCloudDb.Migrations +{ + public partial class Add_permissions_for_ProcessMap : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.InsertData( + table: "t_permission", + columns: new[] { "id", "description", "name" }, + values: new object[,] + { + { 513, "Разрешение просматривать РТК", "ProcessMap.get" }, + { 514, "Разрешение редактировать РТК", "ProcessMap.edit" }, + { 515, "Разрешение удалять РТК", "ProcessMap.delete" } + }); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DeleteData( + table: "t_permission", + keyColumn: "id", + keyValue: 513); + + migrationBuilder.DeleteData( + table: "t_permission", + keyColumn: "id", + keyValue: 514); + + migrationBuilder.DeleteData( + table: "t_permission", + keyColumn: "id", + keyValue: 515); + } + } +} diff --git a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs index 1cd03876..ffb9f96e 100644 --- a/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs +++ b/AsbCloudDb/Migrations/AsbCloudDbContextModelSnapshot.cs @@ -1783,6 +1783,24 @@ namespace AsbCloudDb.Migrations Id = 512, Description = "Разрешение удалять плановая траектория", Name = "TelemetryWirelineRunOut.delete" + }, + new + { + Id = 513, + Description = "Разрешение просматривать РТК", + Name = "ProcessMap.get" + }, + new + { + Id = 514, + Description = "Разрешение редактировать РТК", + Name = "ProcessMap.edit" + }, + new + { + Id = 515, + Description = "Разрешение удалять РТК", + Name = "ProcessMap.delete" }); }); diff --git a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs index ff7ca9c1..c8551550 100644 --- a/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs +++ b/AsbCloudDb/Model/DefaultData/EntityFillerPermission.cs @@ -141,6 +141,10 @@ new (){ Id = 510, Name="TelemetryWirelineRunOut.get", Description="Разрешение просматривать плановая траектория"}, new (){ Id = 511, Name="TelemetryWirelineRunOut.edit", Description="Разрешение редактировать плановая траектория"}, new (){ Id = 512, Name="TelemetryWirelineRunOut.delete", Description="Разрешение удалять плановая траектория"}, + + new (){ Id = 513, Name="ProcessMap.get", Description="Разрешение просматривать РТК"}, + new (){ Id = 514, Name="ProcessMap.edit", Description="Разрешение редактировать РТК"}, + new (){ Id = 515, Name="ProcessMap.delete", Description="Разрешение удалять РТК"}, }; } }