diff --git a/AsbCloudApp/AsbCloudApp.csproj b/AsbCloudApp/AsbCloudApp.csproj index e84cf12c..ec491ed5 100644 --- a/AsbCloudApp/AsbCloudApp.csproj +++ b/AsbCloudApp/AsbCloudApp.csproj @@ -10,4 +10,10 @@ + + + + + + diff --git a/AsbCloudApp/Data/DailyReport/DailyReportBhaDto.cs b/AsbCloudApp/Data/DailyReport/DailyReportBhaDto.cs new file mode 100644 index 00000000..7039d59f --- /dev/null +++ b/AsbCloudApp/Data/DailyReport/DailyReportBhaDto.cs @@ -0,0 +1,12 @@ +using System; +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportBhaDto + { + /// + /// КНБК описание + /// + public string BHADescription { get; set; } + } +} + diff --git a/AsbCloudApp/Data/DailyReport/DailyReportDimensionlessDto.cs b/AsbCloudApp/Data/DailyReport/DailyReportDimensionlessDto.cs new file mode 100644 index 00000000..27766df6 --- /dev/null +++ b/AsbCloudApp/Data/DailyReport/DailyReportDimensionlessDto.cs @@ -0,0 +1,27 @@ +using System; +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportDimensionlessDto + { + /// + /// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию + /// + public double? StandardTimeBarrelPreparation { get; set; } + + /// + /// Нормативное время на одну операцию по наращиванию + /// + public double? StandardTimeExtension { get; set; } + + /// + /// Фактическое время проработок при подготовке ствола скважины к наращиванию. + /// + public double? ActualTimeBarrelPreparation { get; set; } + + /// + /// Фактическое время наращиваний + /// + public double? ActualTimeExtension { get; set; } + } +} + diff --git a/AsbCloudApp/Data/DailyReport/DailyReportHeadDto.cs b/AsbCloudApp/Data/DailyReport/DailyReportHeadDto.cs new file mode 100644 index 00000000..38fcea8f --- /dev/null +++ b/AsbCloudApp/Data/DailyReport/DailyReportHeadDto.cs @@ -0,0 +1,110 @@ +using System; +namespace AsbCloudApp.Data.DailyReportModel +{ + /// + /// + /// + public class DailyReportHeadDto + { + /// + /// название скважины + /// + public string WellName { get; set; } + + /// + /// название куста + /// + public string ClusterName { get; set; } + + /// + /// заказчик + /// + public string Customer { get; set; } + + /// + /// подрядчик + /// + public string Contractor { get; set; } + + /// + /// дата рапорта + /// + public DateTime ReportDate { get; set; } + + /// + /// глубина забоя на дату начала интервала + /// + public double? WellDepthIntervalStartDate { get; set; } + + /// + /// глубина забоя на дату окончания интервала + /// + public double? WellDepthIntervalFinishDate { get; set; } + + /// + /// Глубина забоя по стволу на окончание отчетного периода + /// + public double? BottomholeDepth { get; set; } + + /// + /// Глубина забоя по вертикали на дату окончания отчетного периода + /// + public double? VerticalDepth { get; set; } + + /// + /// Зенитный угол на дату окончания отчетного периода + /// + public double? ZenithAngle { get; set; } + + /// + /// Азимутальный угол на дату окончания отчетного периода + /// + public double? AzimuthAngle { get; set; } + + /// + /// ФИО бурильщиков + /// + public string FirstDriller { get; set; } + + /// + /// ФИО бурильщиков + /// + public string SecondDriller { get; set; } + + /// + /// Время работы АПД + /// + public double? WorkTimeSAUB { get; set; } + + /// + /// Время работы спин мастер + /// + public double? WorkTimeSpinMaster { get; set; } + + /// + /// Время работы torqueMaster + /// + public double? WorkTimeTorkMaster { get; set; } + + /// + /// количество метров пробуренных с включенным АПД + /// + public double? PenetrationSAUB { get; set; } + + /// + /// количество метров пробуренных с включенным Спин мастер + /// + public double? PenetrationSpinMaster { get; set; } + + /// + /// количество метров пробуренных с включенным torqueMaster + /// + public double? PenetrationTorkMaster { get; set; } + + /// + /// Количество запусков МСЕ + /// + public int CountLaunchesMSE { get; set; } + } +} + diff --git a/AsbCloudApp/Data/DailyReport/DailyReportSaubDto.cs b/AsbCloudApp/Data/DailyReport/DailyReportSaubDto.cs new file mode 100644 index 00000000..b27b9c13 --- /dev/null +++ b/AsbCloudApp/Data/DailyReport/DailyReportSaubDto.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; + +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportSaubDto + { + /// + /// Режимы бурения в роторе + /// + public IEnumerable RotorDrillingModes { get; set; } + + /// + /// режимы бурения в слайде + /// + public IEnumerable SlideDrillingModes { get; set; } + + /// + /// Количество метров пробуренных в роторе за отчетный период + /// + public double? PenetrationInRotor { get; set; } + + /// + /// Количество часов бурения в роторе за отчетный период + /// + public double? NumberDrillingHours { get; set; } + + /// + /// средний диф перепад в роторе за отчетный период + /// + public double? AVGDiffDropRotor { get; set; } + + /// + /// количество метров пробуренных в слайде за отчетный период + /// + public double? PenetrationInSlide { get; set; } + + /// + /// время бурения в роторе за отчетный период + /// + public double? DrillingTimeInRotor { get; set; } + + /// + /// средний диф. перепад в слайде за отчетный период + /// + public double? AVGDiffPressureSlide { get; set; } + + /// + /// Плановая МСП за секцию + /// + public double? SectionROPPlan { get; set; } + + /// + /// Общее время бурения за секцию + /// + public double? SectionDrillingTimeTotal { get; set; } + + /// + /// Общая проходка за секцию + /// + public double? SectionPenetrationTotal { get; set; } + + /// + /// Количество наращиваний за отчетный период + /// + public int ExtensionsCount { get; set; } + + /// + /// Отклонение относительно ГГД + /// + public double? DeviationFromTVD { get; set; } + + /// + /// указываются все причины, которые влияют на снижение МСП. + /// + public string DeclinesReasonsROP { get; set; } + + } +} + diff --git a/AsbCloudApp/Data/DailyReport/DailyReportSignDto.cs b/AsbCloudApp/Data/DailyReport/DailyReportSignDto.cs new file mode 100644 index 00000000..3c1bd223 --- /dev/null +++ b/AsbCloudApp/Data/DailyReport/DailyReportSignDto.cs @@ -0,0 +1,17 @@ +using System; +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportSignDto + { + /// + /// ФИО Мастера буровой + /// + public string DrillingMaster { get; set; } + + /// + /// ФИО супервайзера + /// + public string Supervisor { get; set; } + } +} + diff --git a/AsbCloudDb/AsbCloudDb.csproj b/AsbCloudDb/AsbCloudDb.csproj index 42a6436b..38f953fe 100644 --- a/AsbCloudDb/AsbCloudDb.csproj +++ b/AsbCloudDb/AsbCloudDb.csproj @@ -17,4 +17,7 @@ + + + diff --git a/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.cs b/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.cs index df65c7c0..dbd30cbf 100644 --- a/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.cs +++ b/AsbCloudDb/Migrations/20211123130153_Add_UserRoles_Permissions.cs @@ -7,6 +7,7 @@ namespace AsbCloudDb.Migrations { protected override void Up(MigrationBuilder migrationBuilder) { + migrationBuilder.DropForeignKey( name: "FK_t_user_t_user_role_id_role", table: "t_user"); diff --git a/AsbCloudDb/Model/DailyReportDB/DailyReportBha.cs b/AsbCloudDb/Model/DailyReportDB/DailyReportBha.cs new file mode 100644 index 00000000..142ed009 --- /dev/null +++ b/AsbCloudDb/Model/DailyReportDB/DailyReportBha.cs @@ -0,0 +1,12 @@ +using System; +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportBha + { + /// + /// КНБК описание + /// + public string BHADescription { get; set; } + } +} + diff --git a/AsbCloudDb/Model/DailyReportDB/DailyReportDb.cs b/AsbCloudDb/Model/DailyReportDB/DailyReportDb.cs new file mode 100644 index 00000000..874fc154 --- /dev/null +++ b/AsbCloudDb/Model/DailyReportDB/DailyReportDb.cs @@ -0,0 +1,45 @@ +using System; +using Microsoft.EntityFrameworkCore; +using System.ComponentModel.DataAnnotations.Schema; +using AsbCloudApp.Data.DailyReportModel; +namespace AsbCloudDb.Model.DailyReportDB +{ +#nullable disable + [Table("t_daily_report"), Comment("Ежедневные отчёты")] + public class DailyReportDb + { + [Column("id_well"), Comment("ID скважины")] + public int IdWell { get; set; } + + [Column("start_date", TypeName = "timestamp with time zone"), Comment("Дата отчёта")] + public DateTimeOffset StartDate { get; set; } + + [Column("blockHead", TypeName = "jsonb"), Comment("1 блок параметров для отчёта")] + public DailyReportHead BlockHead { get; set; } + + [Column("blockBha", TypeName = "jsonb"), Comment("2 блок параметров для отчёта")] + public DailyReportBha BlockBha { get; set; } + + [Column("blockDimensionless", TypeName = "jsonb"), Comment("4 блок параметров для отчёта")] + public DailyReportDimensionless BlockDimensionless { get; set; } + + [Column("blockSaub", TypeName = "jsonb"), Comment("5 блок параметров для отчёта")] + public DailyReportSaub BlockSaub { get; set; } + + [Column("blockSign", TypeName = "jsonb"), Comment("6 блок параметров для отчёта")] + public DailyReportSign BlockSign { get; set; } + + [ForeignKey(nameof(IdWell))] + public virtual Well Well { get; set; } + } +} + + + + + + + + + + diff --git a/AsbCloudDb/Model/DailyReportDB/DailyReportDimensionless.cs b/AsbCloudDb/Model/DailyReportDB/DailyReportDimensionless.cs new file mode 100644 index 00000000..7ca1697d --- /dev/null +++ b/AsbCloudDb/Model/DailyReportDB/DailyReportDimensionless.cs @@ -0,0 +1,27 @@ +using System; +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportDimensionless + { + /// + /// Нормативное время на одну операцию по подготовке ствола скважины к наращиванию + /// + public double? StandardTimeBarrelPreparation { get; set; } + + /// + /// Нормативное время на одну операцию по наращиванию + /// + public double? StandardTimeExtension { get; set; } + + /// + /// Фактическое время проработок при подготовке ствола скважины к наращиванию. + /// + public double? ActualTimeBarrelPreparation { get; set; } + + /// + /// Фактическое время наращиваний + /// + public double? ActualTimeExtension { get; set; } + } +} + diff --git a/AsbCloudDb/Model/DailyReportDB/DailyReportHead.cs b/AsbCloudDb/Model/DailyReportDB/DailyReportHead.cs new file mode 100644 index 00000000..e49a9a0f --- /dev/null +++ b/AsbCloudDb/Model/DailyReportDB/DailyReportHead.cs @@ -0,0 +1,107 @@ +using System; +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportHead + { + /// + /// название скважины + /// + public string WellName { get; set; } + + /// + /// название куста + /// + public string ClusterName { get; set; } + + /// + /// заказчик + /// + public string Customer { get; set; } + + /// + /// подрядчик + /// + public string Contractor { get; set; } + + /// + /// дата рапорта + /// + public DateTime ReportDate { get; set; } + + /// + /// глубина забоя на дату начала интервала + /// + public double? WellDepthIntervalStartDate { get; set; } + + /// + /// глубина забоя на дату окончания интервала + /// + public double? WellDepthIntervalFinishDate { get; set; } + + /// + /// Глубина забоя по стволу на окончание отчетного периода + /// + public double? BottomholeDepth { get; set; } + + /// + /// Глубина забоя по вертикали на дату окончания отчетного периода + /// + public double? VerticalDepth { get; set; } + + /// + /// Зенитный угол на дату окончания отчетного периода + /// + public double? ZenithAngle { get; set; } + + /// + /// Азимутальный угол на дату окончания отчетного периода + /// + public double? AzimuthAngle { get; set; } + + /// + /// ФИО бурильщиков + /// + public string FirstDriller { get; set; } + + /// + /// ФИО бурильщиков + /// + public string SecondDriller { get; set; } + + /// + /// Время работы АПД + /// + public double? WorkTimeSAUB { get; set; } + + /// + /// Время работы спин мастер + /// + public double? WorkTimeSpinMaster { get; set; } + + /// + /// Время работы torqueMaster + /// + public double? WorkTimeTorkMaster { get; set; } + + /// + /// количество метров пробуренных с включенным АПД + /// + public double? PenetrationSAUB { get; set; } + + /// + /// количество метров пробуренных с включенным Спин мастер + /// + public double? PenetrationSpinMaster { get; set; } + + /// + /// количество метров пробуренных с включенным torqueMaster + /// + public double? PenetrationTorkMaster { get; set; } + + /// + /// Количество запусков МСЕ + /// + public int CountLaunchesMSE { get; set; } + } +} + diff --git a/AsbCloudDb/Model/DailyReportDB/DailyReportSaub.cs b/AsbCloudDb/Model/DailyReportDB/DailyReportSaub.cs new file mode 100644 index 00000000..1d45aa14 --- /dev/null +++ b/AsbCloudDb/Model/DailyReportDB/DailyReportSaub.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; + +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportSaub + { + /// + /// Режимы бурения в роторе + /// + public IEnumerable RotorDrillingModes { get; set; } + + /// + /// режимы бурения в слайде + /// + public IEnumerable SlideDrillingModes { get; set; } + + /// + /// Количество метров пробуренных в роторе за отчетный период + /// + public double? PenetrationInRotor { get; set; } + + /// + /// Количество часов бурения в роторе за отчетный период + /// + public double? NumberDrillingHours { get; set; } + + /// + /// средний диф перепад в роторе за отчетный период + /// + public double? AVGDiffDropRotor { get; set; } + + /// + /// количество метров пробуренных в слайде за отчетный период + /// + public double? PenetrationInSlide { get; set; } + + /// + /// время бурения в роторе за отчетный период + /// + public double? DrillingTimeInRotor { get; set; } + + /// + /// средний диф. перепад в слайде за отчетный период + /// + public double? AVGDiffPressureSlide { get; set; } + + /// + /// Плановая МСП за секцию + /// + public double? SectionROPPlan { get; set; } + + /// + /// Общее время бурения за секцию + /// + public double? SectionDrillingTimeTotal { get; set; } + + /// + /// Общая проходка за секцию + /// + public double? SectionPenetrationTotal { get; set; } + + /// + /// Количество наращиваний за отчетный период + /// + public int ExtensionsCount { get; set; } + + /// + /// Отклонение относительно ГГД + /// + public double? DeviationFromTVD { get; set; } + + /// + /// указываются все причины, которые влияют на снижение МСП. + /// + public string DeclinesReasonsROP { get; set; } + + } +} + diff --git a/AsbCloudDb/Model/DailyReportDB/DailyReportSign.cs b/AsbCloudDb/Model/DailyReportDB/DailyReportSign.cs new file mode 100644 index 00000000..31d951b0 --- /dev/null +++ b/AsbCloudDb/Model/DailyReportDB/DailyReportSign.cs @@ -0,0 +1,17 @@ +using System; +namespace AsbCloudApp.Data.DailyReportModel +{ + public class DailyReportSign + { + /// + /// ФИО Мастера буровой + /// + public string DrillingMaster { get; set; } + + /// + /// ФИО супервайзера + /// + public string Supervisor { get; set; } + } +} + diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportMakerExcel.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportMakerExcel.cs index 8e0ed0fe..919682d3 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportMakerExcel.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportMakerExcel.cs @@ -1,4 +1,5 @@ using AsbCloudApp.Data; +using AsbCloudApp.Data.DailyReportModel; using ClosedXML.Excel; using System; using System.IO; @@ -8,6 +9,585 @@ namespace AsbCloudInfrastructure.Services.DailyReport { public class DailyReportMakerExcel { + + + // черновик реализации отчета "по блокам" + + public Stream MakeReportFromBlocks(DailyReportHeadDto blockHead, DailyReportBhaDto blockBha, DailyReportDimensionlessDto blockDimensionless, DailyReportSaubDto blockSaub, DailyReportSignDto blockSign) + { + using var workbook = new XLWorkbook(); + FillSheet6blocks(workbook, blockHead, blockBha, blockDimensionless, blockSaub, blockSign); + MemoryStream memoryStream = new MemoryStream(); + workbook.SaveAs(memoryStream, new SaveOptions { }); + memoryStream.Seek(0, SeekOrigin.Begin); + return memoryStream; + } + + private String converteCellCoordinate(int row, bool isCaps, int column) + { + var c = (Char)((isCaps ? 65 : 97) + (column - 1)); + string convertColumn = c.ToString(); + return $"{convertColumn}{row}"; + } + + public void FillSheet6blocks(XLWorkbook workbook, DailyReportHeadDto blockHead, DailyReportBhaDto blockBha, DailyReportDimensionlessDto blockDimensionless, DailyReportSaubDto blockSaub, DailyReportSignDto blockSign) + { + var sheet = workbook.Worksheets.First(); + sheet.Name = blockHead.ReportDate.ToString("dd.MM.yyyy"); + var tuple = (row: 3, column: 3); + + tuple = (AddBlockHead1(sheet, blockHead,(tuple.row,tuple.column)).row , AddBlockHead1(sheet, blockHead, (tuple.row, tuple.column)).column); + + + AddBlockBha(sheet, blockBha); + AddBlockTimeBalance(sheet); + AddBlockDimensionless(sheet, blockDimensionless); + AddBlockSaub(sheet, blockSaub); + AddBlockSign(sheet, blockSign); + + + } + // + + private (int row, int column) AddBlockHead1(IXLWorksheet sheet, DailyReportHeadDto blockDto, (int row, int column) tupleStart) + { + var tuple = (row: tupleStart.row, column: tupleStart.column); + sheet.Cell(tuple.row, tuple.column).Value = + $"Суточная сводка бурения скважины: {blockDto.WellName}, куст: {blockDto.ClusterName}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); + //4 + tuple.row += 1; + sheet.Cell(tuple.row, tuple.column).Value = + $"Заказчик: {blockDto.Customer}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); + tuple.row += 1; + sheet.Cell(tuple.row, tuple.column).Value = + $"Подрядчик: {blockDto.Contractor}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); + tuple.row += 2; + //7,3 + sheet.Cell(tuple.row, tuple.column).Value = "Отчетный период"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 3).Merge(); + tuple.column += 4; + sheet.Cell(tuple.row, tuple.column).Value = "Забой за отчетный период, м"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 3).Merge(); + tuple.column = tupleStart.column; + tuple.row += 1; + //8,3 + + sheet.Cell(tuple.row, tuple.column).Value = "От (дата, время)"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); + + tuple.column += 2; //8,5 + sheet.Cell(tuple.row, tuple.column).Value = "До (дата, время)"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); + tuple.column += 2; //8,7 + sheet.Cell(tuple.row, tuple.column).Value = "От"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); + tuple.column += 2; //8,9 + sheet.Cell(tuple.row, tuple.column).Value = "До"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); + tuple.column = tupleStart.column; + tuple.row += 1; //9,3 + + + + sheet.Cell(tuple.row, tuple.column).Value = $"{blockDto.ReportDate}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column+2).Merge(); + tuple.column += 2; + //согласно формуле в шаблоне - ячейка С9 + sheet.Cell(tuple.row, tuple.column).FormulaA1 = $"={converteCellCoordinate(tuple.row , true, tuple.column)}-1"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); + tuple.column += 2; + sheet.Cell(tuple.row, tuple.column).Value = $"{blockDto.WellDepthIntervalStartDate}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); + tuple.column += 2; + sheet.Cell(tuple.row, tuple.column).Value = $"{blockDto.WellDepthIntervalFinishDate}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); + tuple.column = tupleStart.column; + tuple.row += 2; //11,3 + + + + sheet.Cell(tuple.Item1 + 8, tuple.Item2).Value = "Данные по траектории скважины на конец суток"; + sheet.Range(tuple.Item1 + 8, tuple.Item2, tuple.Item1 + 8, tuple.Item2+7).Merge(); + sheet.Cell(tuple.Item1 + 9, tuple.Item2).Value = "Глубина по стволу"; + sheet.Range(tuple.Item1 + 9, tuple.Item2, tuple.Item1 + 9, tuple.Item2+1).Merge(); + sheet.Cell(13, 3).Value = $"{blockDto.BottomholeDepth}"; + sheet.Range(13, 3, 13, 4).Merge(); + sheet.Cell(12, 5).Value = "Глубина по вертикали"; + sheet.Range(12, 5, 12, 6).Merge(); + sheet.Cell(13, 5).Value = $"{blockDto.VerticalDepth}"; + sheet.Range(13, 5, 13, 6).Merge(); + sheet.Cell(12, 7).Value = "Зенитный угол"; + sheet.Range(12, 7, 12, 8).Merge(); + sheet.Cell(13, 7).Value = $"{blockDto.ZenithAngle}"; + sheet.Range(13, 7, 13, 8).Merge(); + sheet.Cell(12, 9).Value = "Азимут"; + sheet.Range(12, 9, 12, 10).Merge(); + sheet.Cell(13, 9).Value = $"{blockDto.AzimuthAngle}"; + sheet.Range(13, 9, 13, 10).Merge(); + sheet.Cell(15, 3).Value = "Бурильщик 1 смена"; + sheet.Range(15, 3, 15, 4).Merge(); + sheet.Cell(15, 5).Value = $"{blockDto.FirstDriller}"; + sheet.Range(15, 6, 15, 7).Merge(); + sheet.Cell(16, 3).Value = "Бурильщик 2 смена"; + sheet.Range(16, 3, 16, 4).Merge(); + sheet.Cell(16, 5).Value = $"{blockDto.SecondDriller}"; + sheet.Range(16, 6, 16, 7).Merge(); + + sheet.Cell(18, 3).Value = "Работа модулей САУБ:"; + sheet.Range(18, 3, 15, 5).Merge(); + sheet.Cell(18, 6).Value = "Часов:"; + sheet.Cell(18, 7).Value = "Метров:"; + sheet.Cell(19, 3).Value = "АПД (автоматическая подача долота), ч/м:"; + sheet.Range(19, 3, 19, 5).Merge(); + sheet.Cell(19, 6).Value = $"{blockDto.WorkTimeSAUB}"; + sheet.Cell(19, 7).Value = $"{blockDto.PenetrationSAUB}"; + + sheet.Cell(20, 3).Value = "Спин Мастер (осцилляция),ч/м:"; + sheet.Range(20, 3, 20, 5).Merge(); + sheet.Cell(20, 6).Value = $"{blockDto.WorkTimeSpinMaster}"; + sheet.Cell(20, 7).Value = $"{blockDto.PenetrationSpinMaster}"; + + sheet.Cell(21, 3).Value = "Торк Мастер (демпфирование), ч/:"; + sheet.Range(21, 3, 21, 5).Merge(); + sheet.Cell(21, 6).Value = $"{blockDto.WorkTimeTorkMaster}"; + sheet.Cell(21, 7).Value = $"{blockDto.PenetrationTorkMaster}"; + + sheet.Cell(22, 3).Value = "МСЕ, колличество запусков, раз:"; + sheet.Range(22, 3, 22, 5).Merge(); + sheet.Cell(22, 6).Value = $"{blockDto.CountLaunchesMSE}"; + sheet.Range(22, 6, 22, 7).Merge(); + + return (tuple.row, tuple.column); + + } + + + // + private void AddBlockHead(IXLWorksheet sheet, DailyReportHeadDto blockDto) + { + sheet.Cell(3, 3).Value = + $"Суточная сводка бурения скважины №{blockDto.WellName}, куст: {blockDto.ClusterName}"; + sheet.Cell(4, 3).Value = + $"Заказчик: {blockDto.Customer}"; + sheet.Cell(5, 3).Value = + $"Подрядчик: {blockDto.Contractor}"; + sheet.Cell(7, 3).Value = "Отчетный период"; + sheet.Range(7, 3, 7, 6).Merge(); + sheet.Cell(7, 7).Value = "Забой за отчетный период, м"; + sheet.Range(7, 7, 7, 10).Merge(); + sheet.Cell(8, 3).Value = "От (дата, время)"; + sheet.Range(8, 3, 8, 4).Merge(); + sheet.Cell(9, 3).Value = $"{blockDto.ReportDate}"; + sheet.Range(9, 3, 9, 4).Merge(); + sheet.Cell(8, 5).Value = "До (дата, время)"; + sheet.Range(8, 5, 8, 6).Merge(); + sheet.Cell(9, 5).Value = "=C9+1"; + sheet.Range(9, 5, 9, 6).Merge(); + sheet.Cell(8, 7).Value = "От"; + sheet.Range(8, 7, 8, 8).Merge(); + sheet.Cell(9, 7).Value = $"{blockDto.WellDepthIntervalStartDate}"; + sheet.Range(9, 7, 9, 8).Merge(); + sheet.Cell(8, 9).Value = "До"; + sheet.Range(8, 9, 8, 10).Merge(); + sheet.Cell(9, 9).Value = $"{blockDto.WellDepthIntervalFinishDate}"; + sheet.Range(9, 9, 9, 10).Merge(); + sheet.Cell(11, 3).Value = "Данные по траектории скважины на конец суток"; + sheet.Range(11, 3, 11, 10).Merge(); + sheet.Cell(12, 3).Value = "Глубина по стволу"; + sheet.Range(12, 3, 12, 4).Merge(); + sheet.Cell(13, 3).Value = $"{blockDto.BottomholeDepth}"; + sheet.Range(13, 3, 13, 4).Merge(); + sheet.Cell(12, 5).Value = "Глубина по вертикали"; + sheet.Range(12, 5, 12, 6).Merge(); + sheet.Cell(13, 5).Value = $"{blockDto.VerticalDepth}"; + sheet.Range(13, 5, 13, 6).Merge(); + sheet.Cell(12, 7).Value = "Зенитный угол"; + sheet.Range(12, 7, 12, 8).Merge(); + sheet.Cell(13, 7).Value = $"{blockDto.ZenithAngle}"; + sheet.Range(13, 7, 13, 8).Merge(); + sheet.Cell(12, 9).Value = "Азимут"; + sheet.Range(12, 9, 12, 10).Merge(); + sheet.Cell(13, 9).Value = $"{blockDto.AzimuthAngle}"; + sheet.Range(13, 9, 13, 10).Merge(); + sheet.Cell(15, 3).Value = "Бурильщик 1 смена"; + sheet.Range(15, 3, 15, 4).Merge(); + sheet.Cell(15, 5).Value = $"{blockDto.FirstDriller}"; + sheet.Range(15, 6, 15, 7).Merge(); + sheet.Cell(16, 3).Value = "Бурильщик 2 смена"; + sheet.Range(16, 3, 16, 4).Merge(); + sheet.Cell(16, 5).Value = $"{blockDto.SecondDriller}"; + sheet.Range(16, 6, 16, 7).Merge(); + + sheet.Cell(18, 3).Value = "Работа модулей САУБ:"; + sheet.Range(18, 3, 15, 5).Merge(); + sheet.Cell(18, 6).Value = "Часов:"; + sheet.Cell(18, 7).Value = "Метров:"; + sheet.Cell(19, 3).Value = "АПД (автоматическая подача долота), ч/м:"; + sheet.Range(19, 3, 19, 5).Merge(); + sheet.Cell(19, 6).Value = $"{blockDto.WorkTimeSAUB}"; + sheet.Cell(19, 7).Value = $"{blockDto.PenetrationSAUB}"; + + sheet.Cell(20, 3).Value = "Спин Мастер (осцилляция),ч/м:"; + sheet.Range(20, 3, 20, 5).Merge(); + sheet.Cell(20, 6).Value = $"{blockDto.WorkTimeSpinMaster}"; + sheet.Cell(20, 7).Value = $"{blockDto.PenetrationSpinMaster}"; + + sheet.Cell(21, 3).Value = "Торк Мастер (демпфирование), ч/:"; + sheet.Range(21, 3, 21, 5).Merge(); + sheet.Cell(21, 6).Value = $"{blockDto.WorkTimeTorkMaster}"; + sheet.Cell(21, 7).Value = $"{blockDto.PenetrationTorkMaster}"; + + sheet.Cell(22, 3).Value = "МСЕ, колличество запусков, раз:"; + sheet.Range(22, 3, 22, 5).Merge(); + sheet.Cell(22, 6).Value = $"{blockDto.CountLaunchesMSE}"; + sheet.Range(22, 6, 22, 7).Merge(); + + } + + private void AddBlockBha(IXLWorksheet sheet, DailyReportBhaDto blockDto) + { + sheet.Cell(24, 3).Value = + $"{blockDto.BHADescription}"; + sheet.Range(24, 3, 24, 10).Merge(); + sheet.Cell(26, 3).Value = + "Выполняемые операции в отчетный период, комментарии:"; + sheet.Range(26, 3, 26, 7).Merge(); + sheet.Cell(26, 8).Value = "Продолжительность, ч. "; + sheet.Range(26, 8, 26, 9).Merge(); + sheet.Cell(26, 10).Value = "Итого"; + + sheet.Cell(27, 3).Value = + "Бурение с наращиваниями в инт. 2195-2763м."; + sheet.Range(27, 3, 27, 7).Merge(); + sheet.Cell(27, 8).Value = ""; + sheet.Cell(27, 9).Value = ""; + sheet.Cell(27, 10).Value = "=IF(I27>0;(I27-H27)*24;\"\")"; + + sheet.Cell(28, 3).Value = + "Промывка."; + sheet.Range(28, 3, 28, 7).Merge(); + sheet.Cell(28, 8).Value = ""; + sheet.Cell(28, 9).Value = ""; + sheet.Cell(28, 10).Value = "=IF(I28>0;(I28-H28)*24;\"\")"; + + sheet.Cell(29, 3).Value = + "Подъем КНБК в инт. 2763-2442м."; + sheet.Range(29, 3, 29, 7).Merge(); + sheet.Cell(29, 8).Value = ""; + sheet.Cell(29, 9).Value = ""; + sheet.Cell(29, 10).Value = "=IF(I29>0;(I29-H29)*24;\"\")"; + + sheet.Cell(30, 3).Value = + "Спуск КНБК в инт. 2442-2763м."; + sheet.Range(30, 3, 30, 7).Merge(); + sheet.Cell(30, 8).Value = ""; + sheet.Cell(30, 9).Value = ""; + sheet.Cell(30, 10).Value = "=IF(I30>0;(I30-H30)*24;\"\")"; + + sheet.Cell(27, 3).Value = + "Бурение с наращиваниями в инт. 2763-2850м."; + sheet.Range(31, 3, 31, 7).Merge(); + sheet.Cell(31, 8).Value = ""; + sheet.Cell(31, 9).Value = ""; + sheet.Cell(31, 10).Value = "=IF(I31>0;(I31-H31)*24;\"\")"; + } + + + private void AddBlockTimeBalance(IXLWorksheet sheet) + { + sheet.Cell(33, 6).Value = + "БАЛАНС ВРЕМЕНИ"; + sheet.Range(33, 6, 33, 7).Merge(); + + sheet.Cell(34, 4).Value = + "Бурение"; + sheet.Cell(34, 5).Value = + ""; + sheet.Cell(34, 6).Value = + "КНБК"; + sheet.Cell(34, 7).Value = + ""; + sheet.Cell(34, 8).Value = + "ОЗЦ"; + sheet.Cell(34, 9).Value = + ""; + + sheet.Cell(35, 4).Value = + "Промывка"; + sheet.Cell(35, 5).Value = + ""; + sheet.Cell(35, 6).Value = + "СПО"; + sheet.Cell(35, 7).Value = + ""; + sheet.Cell(35, 8).Value = + "Тех. работы"; + sheet.Cell(35, 9).Value = + ""; + + sheet.Cell(36, 4).Value = + "Наращивание"; + sheet.Cell(36, 5).Value = + ""; + sheet.Cell(36, 6).Value = + "ПЗР"; + sheet.Cell(36, 7).Value = + ""; + sheet.Cell(36, 8).Value = + "Снятие замера"; + sheet.Cell(36, 9).Value = + ""; + + sheet.Cell(37, 4).Value = + "Проработка"; + sheet.Cell(37, 5).Value = + ""; + sheet.Cell(37, 6).Value = + "ПВО"; + sheet.Cell(37, 7).Value = + ""; + sheet.Cell(37, 8).Value = + "Цементирование"; + sheet.Cell(37, 9).Value = + ""; + + sheet.Cell(38, 4).Value = + "Расширка"; + sheet.Cell(38, 5).Value = + ""; + sheet.Cell(38, 6).Value = + "ПГР"; + sheet.Cell(38, 7).Value = + ""; + sheet.Cell(38, 8).Value = + "Простой"; + sheet.Cell(38, 9).Value = + ""; + + sheet.Cell(39, 4).Value = + "Ремонт "; + sheet.Cell(39, 5).Value = + ""; + sheet.Cell(39, 6).Value = + "ГИС"; + sheet.Cell(39, 7).Value = + ""; + sheet.Cell(39, 8).Value = + "НПВ"; + sheet.Cell(39, 9).Value = + ""; + } + + private void AddBlockDimensionless(IXLWorksheet sheet, DailyReportDimensionlessDto blockDto) + { + + sheet.Cell(41, 6).Value = + "БЕЗМЕТРАЖНЫЕ РАБОТЫ"; + sheet.Range(41, 6, 41, 7).Merge(); + + sheet.Cell(42, 4).Value = + "Подготовка ствола скв. к наращиванию"; + sheet.Range(42, 4, 42, 6).Merge(); + sheet.Cell(42, 7).Value = + "Наращивание"; + sheet.Range(42, 7, 42, 9).Merge(); + + sheet.Cell(43, 4).Value = + "Норматив на одну операцию, (мин):"; + sheet.Range(43, 4, 43, 5).Merge(); + sheet.Cell(43, 6).Value = + $"{blockDto.StandardTimeBarrelPreparation}"; + sheet.Cell(43, 7).Value = + "Норматив на одну операцию, (мин):"; + sheet.Range(43, 7, 43, 8).Merge(); + sheet.Cell(43, 9).Value = + $"{blockDto.StandardTimeExtension}"; + + sheet.Cell(44, 4).Value = + "Проработка при бур, план (ч):"; + sheet.Range(44, 4, 44, 5).Merge(); + sheet.Cell(44, 6).Value = + "=F43/60*G72"; + sheet.Cell(44, 7).Value = + "Наращивание, план (ч):"; + sheet.Range(44, 7, 44, 8).Merge(); + sheet.Cell(44, 9).Value = + "=I43/60*G72"; + + sheet.Cell(45, 4).Value = + "Проработка при бур, факт (ч):"; + sheet.Range(45, 4, 45, 5).Merge(); + sheet.Cell(45, 6).Value = + $"{blockDto.ActualTimeBarrelPreparation}"; + sheet.Cell(45, 7).Value = + "Наращивание, факт (ч):"; + sheet.Range(45, 7, 45, 8).Merge(); + sheet.Cell(45, 9).Value = + $"{blockDto.ActualTimeExtension}"; + + sheet.Cell(46, 4).Value = + "Превышение плановых норм, (ч):"; + sheet.Range(46, 4, 46, 5).Merge(); + sheet.Cell(46, 6).Value = + "=F45-F44"; + sheet.Cell(46, 7).Value = + "Превышение плановых норм, (ч):"; + sheet.Range(46, 7, 46, 8).Merge(); + sheet.Cell(46, 9).Value = + "=I45-I44"; + + sheet.Cell(47, 4).Value = + "Краткие причины: доп проработки при переходе из слайда в ротор, в середине свечи."; + sheet.Range(47, 4, 48, 6).Merge(); + + sheet.Cell(47, 7).Value = + "Краткие причины: нехватка пальцев на обоих руках у первого помощника бурильщика."; + sheet.Range(47, 7, 48, 9).Merge(); + + } + + //private (int,int) AddBlockSaub(IXLWorksheet sheet, Tuple startRow, DailyReportBlock5 blockDto) + private void AddBlockSaub(IXLWorksheet sheet, DailyReportSaubDto blockDto) + { + + sheet.Cell(50, 3).Value = + $"Бурение в роторе : {blockDto.RotorDrillingModes}"; + sheet.Range(50, 4, 50, 10).Merge(); + sheet.Cell(50, 3).Value = + $"Бурение в слайде : {blockDto.SlideDrillingModes}"; + sheet.Range(50, 4, 50, 10).Merge(); + + + sheet.Cell(53, 3).Value = "Бурение в роторе (за отчетный период) с использование САУБ-1"; + sheet.Range(53, 3, 53, 10).Merge(); + sheet.Cell(54, 3).Value = "Проходка"; + sheet.Range(54, 3, 54, 4).Merge(); + sheet.Cell(55, 3).Value = $"{blockDto.PenetrationInRotor}"; + sheet.Range(55, 3, 55, 4).Merge(); + sheet.Cell(54, 5).Value = "Часы бурения"; + sheet.Range(54, 5, 54, 6).Merge(); + sheet.Cell(55, 5).Value = $"{blockDto.NumberDrillingHours}"; + sheet.Range(55, 5, 55, 6).Merge(); + sheet.Cell(54, 7).Value = "Мех. скорость"; + sheet.Range(54, 7, 54, 8).Merge(); + sheet.Cell(55, 7).Value = "=IF(E55>0;C55/E55;0)"; + sheet.Range(55, 7, 55, 8).Merge(); + sheet.Cell(54, 9).Value = "Среднее диф. Давление"; + sheet.Range(54, 9, 54, 10).Merge(); + sheet.Cell(55, 9).Value = $"{blockDto.AVGDiffDropRotor}"; + sheet.Range(55, 9, 55, 10).Merge(); + + sheet.Cell(57, 3).Value = "Бурение в слайде (за отчетный период) с использование САУБ-1"; + sheet.Range(57, 3, 57, 10).Merge(); + sheet.Cell(58, 3).Value = "Проходка"; + sheet.Range(58, 3, 58, 4).Merge(); + sheet.Cell(59, 3).Value = $"{blockDto.PenetrationInSlide}"; + sheet.Range(59, 3, 59, 4).Merge(); + sheet.Cell(58, 5).Value = "Часы бурения"; + sheet.Range(58, 5, 58, 6).Merge(); + sheet.Cell(59, 5).Value = $"{blockDto.DrillingTimeInRotor}"; + sheet.Range(59, 5, 59, 6).Merge(); + sheet.Cell(58, 7).Value = "Мех. скорость"; + sheet.Range(58, 7, 58, 8).Merge(); + sheet.Cell(59, 7).Value = "=IF(E59>0;C59/E59;0)"; + sheet.Range(59, 7, 59, 8).Merge(); + sheet.Cell(58, 9).Value = "Среднее диф. Давление"; + sheet.Range(58, 9, 58, 10).Merge(); + sheet.Cell(59, 9).Value = $"{blockDto.AVGDiffPressureSlide}"; + sheet.Range(59, 9, 59, 10).Merge(); + + sheet.Cell(61, 3).Value = "Итого за отчетный период, использование САУБ-1"; + sheet.Range(61, 3, 61, 8).Merge(); + sheet.Cell(62, 3).Value = "Проходка"; + sheet.Range(62, 3, 62, 4).Merge(); + sheet.Cell(63, 3).Value = "=IF((C59+C55)<>(I9-G9);\"ОШИБКА\";C55+C59)"; + sheet.Range(63, 3, 63, 4).Merge(); + sheet.Cell(62, 5).Value = "Часы бурения"; + sheet.Range(62, 5, 62, 6).Merge(); + sheet.Cell(63, 5).Value = "=E55+E59"; + sheet.Range(63, 5, 63, 6).Merge(); + sheet.Cell(62, 7).Value = "Мех. скорость"; + sheet.Range(62, 7, 62, 8).Merge(); + sheet.Cell(63, 7).Value = ""; + sheet.Range(63, 7, 63, 8).Merge(); + sheet.Cell(61, 9).Value = "Плановая мех скорость"; + sheet.Range(61, 9, 62, 10).Merge(); + sheet.Cell(63, 9).Value = $"{blockDto.SectionROPPlan}"; + sheet.Range(63, 9, 63, 10).Merge(); + + + sheet.Cell(65, 3).Value = "Увеличение мех скорости за секцию %"; + sheet.Range(65, 3, 65, 6).Merge(); + sheet.Cell(65, 7).Value = ""; + sheet.Range(65, 7, 65, 10).Merge(); + sheet.Cell(66, 3).Value = "Увеличение мех скорости за сутки %"; + sheet.Range(66, 3, 66, 6).Merge(); + sheet.Cell(66, 7).Value = ""; + sheet.Range(66, 7, 66, 10).Merge(); + sheet.Cell(67, 3).Value = "Сокращение времени бурения за секцию, ч"; + sheet.Range(67, 3, 67, 6).Merge(); + sheet.Cell(67, 7).Value = ""; + sheet.Range(67, 7, 67, 10).Merge(); + sheet.Cell(68, 3).Value = "Ротор / слайд, %"; + sheet.Range(68, 3, 68, 6).Merge(); + sheet.Cell(68, 7).Value = ""; + sheet.Range(68, 7, 68, 10).Merge(); + sheet.Cell(69, 3).Value = "МСП за секцию м/ч."; + sheet.Range(69, 3, 69, 6).Merge(); + sheet.Cell(69, 7).Value = ""; + sheet.Range(69, 7, 69, 10).Merge(); + + sheet.Cell(70, 3).Value = "Время бурения за секцию"; + sheet.Range(70, 3, 70, 6).Merge(); + sheet.Cell(70, 7).Value = $"{blockDto.SectionDrillingTimeTotal}"; + sheet.Range(70, 7, 70, 10).Merge(); + + sheet.Cell(71, 3).Value = "Проходка за секцию"; + sheet.Range(71, 3, 71, 6).Merge(); + sheet.Cell(71, 7).Value = $"{blockDto.SectionPenetrationTotal}"; + sheet.Range(71, 7, 71, 10).Merge(); + + sheet.Cell(72, 3).Value = "Кол- во наращиваний"; + sheet.Range(72, 3, 72, 6).Merge(); + sheet.Cell(72, 7).Value = $"{blockDto.ExtensionsCount}"; + sheet.Range(72, 7, 72, 10).Merge(); + + sheet.Cell(73, 3).Value = "Отклонение от ГГД +/-, сут"; + sheet.Range(73, 3, 73, 6).Merge(); + sheet.Cell(73, 7).Value = $"{blockDto.DeviationFromTVD}"; + sheet.Range(73, 7, 73, 10).Merge(); + + sheet.Cell(74, 3).Value = $"Примечание: {blockDto.DeclinesReasonsROP}"; + sheet.Range(74, 3, 75, 10).Merge(); + + } + + private void AddBlockSign(IXLWorksheet sheet, DailyReportSignDto blockDto) + { + sheet.Cell(78, 3).Value = + "Мастер буровой "; + sheet.Range(78, 3, 78, 4).Merge(); + sheet.Cell(78, 9).Value = + $"{blockDto.DrillingMaster}"; + sheet.Range(78, 9, 78, 10).Merge(); + + sheet.Cell(80, 3).Value = + "Супервайзер "; + sheet.Range(80, 3, 80, 4).Merge(); + sheet.Cell(80, 9).Value = + $"{blockDto.Supervisor}"; + sheet.Range(80, 9, 80, 10).Merge(); + + } + + + + + // реализация "как есть" + public Stream MakeReport(DailyReportDto dailyReportDto) { using var templateStream = System.Reflection.Assembly.GetExecutingAssembly() @@ -54,6 +634,7 @@ namespace AsbCloudInfrastructure.Services.DailyReport sheet.Cell(startRow + 2, 3).Value = $"Подрядчик: {reportDto.Contractor}"; + return startRow + 2; } @@ -165,6 +746,7 @@ namespace AsbCloudInfrastructure.Services.DailyReport return startRow + 9; } + // private int AddBlockDrillingModes(IXLWorksheet sheet, int startRow, DailyReportDto reportDto) { sheet.Cell(startRow + 2, 6).Value = @@ -222,6 +804,7 @@ namespace AsbCloudInfrastructure.Services.DailyReport return startRow + 13; } + // private int AddBlockSubscribes(IXLWorksheet sheet, int startRow, DailyReportDto reportDto) { sheet.Cell(startRow + 3, 9).Value = @@ -297,3 +880,4 @@ namespace AsbCloudInfrastructure.Services.DailyReport } } } + diff --git a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs index 058fb103..1945710d 100644 --- a/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs +++ b/AsbCloudInfrastructure/Services/DailyReport/DailyReportService.cs @@ -1,14 +1,15 @@ -using AsbCloudApp.Data; -using AsbCloudApp.Services; -using AsbCloudDb.Model; -using Mapster; -using Microsoft.EntityFrameworkCore; -using System; -using System.Collections.Generic; +using System; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Mapster; +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using System.Collections.Generic; +using AsbCloudApp.Data.DailyReportModel; namespace AsbCloudInfrastructure.Services.DailyReport { @@ -103,6 +104,8 @@ namespace AsbCloudInfrastructure.Services.DailyReport return memoryStream; } + + private async Task GetAsync(int idWell, DateTime date, CancellationToken token) { var offsetHours = wellService.GetTimezone(idWell).Hours; @@ -149,6 +152,77 @@ namespace AsbCloudInfrastructure.Services.DailyReport .Date; return entity; } + + + // черновик реализации "по блокам" + + public async Task MakeReportFromBlocksAsync(int idWell, DateTime date, CancellationToken token = default) + { + var dailyReportDto = await GetAsync(idWell, date, token); + if (dailyReportDto is null) + return null; + var block1 = new DailyReportHeadDto() + { + WellName = dailyReportDto.WellName, + ClusterName = dailyReportDto.ClusterName, + Customer = dailyReportDto.Customer, + Contractor = dailyReportDto.Contractor, + ReportDate = dailyReportDto.ReportDate, + WellDepthIntervalStartDate = dailyReportDto.WellDepthIntervalStartDate, + WellDepthIntervalFinishDate = dailyReportDto.WellDepthIntervalFinishDate, + BottomholeDepth = dailyReportDto.BottomholeDepth, + VerticalDepth = dailyReportDto.VerticalDepth, + ZenithAngle = dailyReportDto.ZenithAngle, + AzimuthAngle = dailyReportDto.AzimuthAngle, + FirstDriller = dailyReportDto.FirstDriller, + SecondDriller = dailyReportDto.SecondDriller, + WorkTimeSAUB = dailyReportDto.WorkTimeSAUB, + WorkTimeSpinMaster = dailyReportDto.WorkTimeSpinMaster, + WorkTimeTorkMaster = dailyReportDto.WorkTimeTorkMaster, + PenetrationSAUB = dailyReportDto.PenetrationSAUB, + PenetrationSpinMaster = dailyReportDto.PenetrationSpinMaster, + PenetrationTorkMaster = dailyReportDto.PenetrationTorkMaster, + CountLaunchesMSE = dailyReportDto.CountLaunchesMSE + }; + var block2 = new DailyReportBhaDto() + { + BHADescription = dailyReportDto.BHADescription + }; + var block4 = new DailyReportDimensionlessDto() + { + ActualTimeBarrelPreparation = dailyReportDto.ActualTimeBarrelPreparation, + ActualTimeExtension = dailyReportDto.ActualTimeExtension, + StandardTimeBarrelPreparation = dailyReportDto.StandardTimeBarrelPreparation, + StandardTimeExtension = dailyReportDto.StandardTimeExtension + }; + var block5 = new DailyReportSaubDto() + { + AVGDiffDropRotor = dailyReportDto.AVGDiffDropRotor, + AVGDiffPressureSlide = dailyReportDto.AVGDiffPressureSlide, + DeclinesReasonsROP = dailyReportDto.DeclinesReasonsROP, + DeviationFromTVD = dailyReportDto.DeviationFromTVD, + DrillingTimeInRotor = dailyReportDto.DrillingTimeInRotor, + NumberDrillingHours = dailyReportDto.NumberDrillingHours, + ExtensionsCount = dailyReportDto.ExtensionsCount, + PenetrationInRotor = dailyReportDto.PenetrationInRotor, + PenetrationInSlide = dailyReportDto.PenetrationInSlide, + RotorDrillingModes = dailyReportDto.RotorDrillingModes, + SectionDrillingTimeTotal = dailyReportDto.SectionDrillingTimeTotal, + SectionPenetrationTotal = dailyReportDto.SectionPenetrationTotal, + SectionROPPlan = dailyReportDto.SectionROPPlan, + SlideDrillingModes = dailyReportDto.SlideDrillingModes + + }; + var block6 = new DailyReportSignDto() + { + DrillingMaster = dailyReportDto.DrillingMaster, + Supervisor = dailyReportDto.Supervisor + }; + + var memoryStream = dailyReportMaker.MakeReportFromBlocks(block1, block2, block4, block5, block6); + return memoryStream; + } } #nullable disable } + diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index c4f6f029..c26c57f6 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -1,5 +1,8 @@ -using AsbCloudInfrastructure.EfCache; +using AsbCloudApp.Data.DailyReportModel; +using AsbCloudInfrastructure.EfCache; +using ClosedXML.Excel; using System; +using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; @@ -12,59 +15,129 @@ namespace ConsoleApp1 // use ServiceFactory to make services static void Main(/*string[] args*/) { - Console.WriteLine("hit keyboard to start"); - Console.ReadLine(); - - for (int i = 0; i < 24; i++) + var block = new DailyReportHeadDto() { - var t = new Thread(_ => - { - for (int j = 0; j < 32; j++) - //Task.Run(GetDataAsync).Wait(); - GetData(); - }); - t.Start(); - } + AzimuthAngle=12, + WellName= "WellName", + ClusterName= "clusterName", + Customer="customer", + Contractor="Contractor", + ReportDate = DateTime.Now, + WellDepthIntervalFinishDate= 27.5, + WellDepthIntervalStartDate= 26.5, + BottomholeDepth= 66.6 + }; - Console.WriteLine("End of Test"); - Console.ReadLine(); + var ms = MakeReportFromBlocks(block); + //File.Create("", MakeReportFromBlocks(block)); + using var file = new FileStream("file.xlsx", FileMode.Create, System.IO.FileAccess.Write); + byte[] bytes = new byte[ms.Length]; + ms.Read(bytes, 0, (int)ms.Length); + file.Write(bytes, 0, bytes.Length); + ms.Close(); } - static TimeSpan obso = TimeSpan.FromSeconds(5); - static (long, long) GetData() + public static Stream MakeReportFromBlocks(DailyReportHeadDto blockHead) { - using var db = ServiceFactory.MakeContext(); - var sw = System.Diagnostics.Stopwatch.StartNew(); - var cs = db.TelemetryDataSaub - .Where(t => t.IdTelemetry == 135) - .OrderBy(t => t.DateTime) - .Take(100_000) - .FromCache("tds", obso, r => new { r.Pressure, r.HookWeight }) - .ToList(); - sw.Stop(); - Console.WriteLine($"{DateTime.Now}\tth: {Thread.CurrentThread.ManagedThreadId}\ttime {sw.ElapsedMilliseconds}\tcount {cs.Count}"); - - GC.Collect(); - Thread.Sleep(10); - return (cs.Count, sw.ElapsedMilliseconds); + using var workbook = new XLWorkbook(); + FillSheet6blocks(workbook, blockHead); + MemoryStream memoryStream = new MemoryStream(); + workbook.SaveAs(memoryStream, new SaveOptions { }); + memoryStream.Seek(0, SeekOrigin.Begin); + return memoryStream; } - static async Task<(long, long)> GetDataAsync() + private static String converteCellCoordinate(int row, bool isCaps, int column) { - using var db = ServiceFactory.MakeContext(); - var sw = System.Diagnostics.Stopwatch.StartNew(); - var cs = (await db.TelemetryDataSaub - .Where(t => t.IdTelemetry == 135) - .OrderBy(t => t.DateTime) - .Take(100_000) - .FromCacheDictionaryAsync("tds", obso, r => (r.IdTelemetry, r.DateTime), r => new { r.Pressure, r.HookWeight })) - .ToList(); - sw.Stop(); - Console.WriteLine($"{DateTime.Now}\tth: {Thread.CurrentThread.ManagedThreadId}\ttime {sw.ElapsedMilliseconds}\tcount {cs.Count}"); + var c = (Char)((isCaps ? 65 : 97) + (column - 1)); + string convertColumn = c.ToString(); + return $"{convertColumn}{row}"; + } + + public static void FillSheet6blocks(XLWorkbook workbook, DailyReportHeadDto blockHead) + { + var sheet = workbook.Worksheets.Add(blockHead.ReportDate.ToString("dd.MM.yyyy")); + //sheet.Name = blockHead.ReportDate.ToString("dd.MM.yyyy"); + + var tuple = (row: 3, column: 3); + + tuple = (AddBlockHead1(sheet, blockHead, (tuple.row, tuple.column)).row, AddBlockHead1(sheet, blockHead, (tuple.row, tuple.column)).column); + //sheet.Columns().AdjustToContents(); + } + // + + private static (int row, int column) AddBlockHead1(IXLWorksheet sheet, DailyReportHeadDto blockDto, (int row, int column) tupleStart) + { + + var tuple = (row: tupleStart.row, column: tupleStart.column); + sheet.Cell(tuple.row, tuple.column).Value = + $"Суточная сводка бурения скважины: {blockDto.WellName}, куст: {blockDto.ClusterName}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); + //4 + tuple.row += 1; + sheet.Cell(tuple.row, tuple.column).Value = + $"Заказчик: {blockDto.Customer}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); + tuple.row += 1; + sheet.Cell(tuple.row, tuple.column).Value = + $"Подрядчик: {blockDto.Contractor}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 7).Merge(); + tuple.row += 2; + //7,3 + sheet.Cell(tuple.row, tuple.column).Value = "Отчетный период"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 3).Merge(); + tuple.column += 4; + sheet.Cell(tuple.row, tuple.column).Value = "Забой за отчетный период, м"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 3).Merge(); + tuple.column = tupleStart.column; + tuple.row += 1; + //8,3 + + sheet.Cell(tuple.row, tuple.column).Value = "От (дата, время)"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); + + tuple.column += 2; //8,5 + sheet.Cell(tuple.row, tuple.column).Value = "До (дата, время)"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); + tuple.column += 2; //8,7 + sheet.Cell(tuple.row, tuple.column).Value = "От"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); + tuple.column += 2; //8,9 + sheet.Cell(tuple.row, tuple.column).Value = "До"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 1).Merge(); + tuple.column = tupleStart.column; + tuple.row += 1; //9,3 + + + + sheet.Cell(tuple.row, tuple.column).Value = $"{blockDto.ReportDate}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); + tuple.column += 2; + //согласно формуле в шаблоне - ячейка С9 + sheet.Cell(tuple.row, tuple.column).FormulaA1 = $"={converteCellCoordinate(tuple.row, true, tuple.column-2)}-1"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); + tuple.column += 2; + sheet.Cell(tuple.row, tuple.column).Value = $"{blockDto.WellDepthIntervalStartDate}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); + tuple.column += 2; + sheet.Cell(tuple.row, tuple.column).Value = $"{blockDto.WellDepthIntervalFinishDate}"; + sheet.Range(tuple.row, tuple.column, tuple.row, tuple.column + 2).Merge(); + tuple.column = tupleStart.column; + tuple.row += 2; //11,3 + + + + return (tuple.Item1, tuple.Item2); - GC.Collect(); - Thread.Sleep(10); - return (cs.Count, sw.ElapsedMilliseconds); } } + struct CellAddress + { + public int Col { get; set; } + public int Row { get; set; } + //public string GetExcelAddress() + //{ + + //} + } }