From 3f2a7406d23f98b391a3a139e33118c45b44920a Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Thu, 17 Mar 2022 16:56:13 +0500 Subject: [PATCH] Add ScheduleReport --- .../Services/IScheduleReportService.cs | 11 + .../AsbCloudInfrastructure.csproj | 2 + AsbCloudInfrastructure/DependencyInjection.cs | 1 + .../WellOperationService/ReportTemplate.xlsx | Bin 76971 -> 0 bytes .../ScheduleReportService.cs | 312 ++++++++++++++++++ .../ScheduleReportTemplate.xlsx | Bin 0 -> 15221 bytes .../Controllers/WellOperationController.cs | 28 ++ ConsoleApp1/Program.cs | 55 ++- 8 files changed, 405 insertions(+), 4 deletions(-) create mode 100644 AsbCloudApp/Services/IScheduleReportService.cs delete mode 100644 AsbCloudInfrastructure/Services/WellOperationService/ReportTemplate.xlsx create mode 100644 AsbCloudInfrastructure/Services/WellOperationService/ScheduleReportService.cs create mode 100644 AsbCloudInfrastructure/Services/WellOperationService/ScheduleReportTemplate.xlsx diff --git a/AsbCloudApp/Services/IScheduleReportService.cs b/AsbCloudApp/Services/IScheduleReportService.cs new file mode 100644 index 00000000..0b0180d5 --- /dev/null +++ b/AsbCloudApp/Services/IScheduleReportService.cs @@ -0,0 +1,11 @@ +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services +{ + public interface IScheduleReportService + { + Task MakeReportAsync(int idWell, CancellationToken token = default); + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 768c3c40..377bd348 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -9,10 +9,12 @@ + + diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 15ecdc2b..f7e83474 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -81,6 +81,7 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); // admin crud services: services.AddTransient, CrudServiceBase>(); // может быть включен в сервис TelemetryService diff --git a/AsbCloudInfrastructure/Services/WellOperationService/ReportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationService/ReportTemplate.xlsx deleted file mode 100644 index bd0220d31ceab12fe6ae0ee965cd4558113f03b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 76971 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 z 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%0D|i@T0)@-mw5{~m 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 MakeReportAsync(int idWell, CancellationToken token = default) + { + var tvd = await operationsStatService.GetTvdAsync(idWell, token); + + if (!tvd.Any()) + return null; + + var well = await wellService.GetAsync(idWell, token); + + var ecxelTemplateStream = GetExcelTemplateStream(); + using var workbook = new XLWorkbook(ecxelTemplateStream, XLEventTracking.Disabled); + FillScheduleSheetToWorkbook(workbook, tvd, well); + FillTvdSheetToWorkbook(workbook, tvd, well); + MemoryStream memoryStream = new MemoryStream(); + workbook.SaveAs(memoryStream, new SaveOptions { }); + memoryStream.Seek(0, SeekOrigin.Begin); + return memoryStream; + } + + private void FillScheduleSheetToWorkbook(XLWorkbook workbook, IEnumerable> tvd, WellDto well) + { + var sheet = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetNameSchedule); + if (sheet is null) + return; + + const int headerRowsCount = 6; + const int rowTitle = 3; + + const int columnRowNumber = 2; + const int columnCaption = 3; + const int columnWellDepthPlan = 4; + const int columnWellDepthFact = 5; + const int columnWellDepthPredict = 6; + const int columnDeltaWellDepthPerDay = 7; + const int columnDurationPlan = 8; + const int columnDurationFact = 9; + const int columnDurationPredict = 10; + const int columnDateEndPlan = 11; + const int columnDateEndFact = 12; + const int columnDateEndPredict = 13; + const int columnGuilty = 14; + const int columnNpt = 15; + + var subTitle = $"на строительство скважины №{well.Caption}, куст: {well.Cluster}, м/р: {well.Deposit}"; + sheet.Row(rowTitle).Cell(3).Value = subTitle; + + var tvdList = tvd.ToList(); + double dayStartDepth = 0d; + double dayNum = 0; + + int i = 0; + for (; i < tvdList.Count; i++) + { + var tvdItem = tvdList[i]; + var operation = tvdItem.Fact ?? tvdItem.Plan; + if (operation is null) + continue; + + var row = sheet.Row(1 + i + headerRowsCount); + + SetCell(row, columnRowNumber, $"{1 + i}"); + SetCell(row, columnCaption, $"{operation.CategoryName} {operation.CategoryInfo}".Trim()); + SetCell(row, columnWellDepthPlan, tvdItem.Plan?.DepthEnd); + SetCell(row, columnWellDepthFact, tvdItem.Fact?.DepthEnd); + SetCell(row, columnWellDepthPredict, tvdItem.Predict?.DepthEnd); + + SetCell(row, columnDeltaWellDepthPerDay, null); + if (tvdItem.Fact is not null) + { + if (dayStartDepth == 0d) + { + dayStartDepth = tvdItem.Fact.DepthStart; + dayNum = tvdItem.Fact.DateStart.DayOfYear; + } + + if (i > 0 && tvdItem.Fact.DateStart.DayOfYear > dayNum) + { + double? delta = tvdItem.Fact.DepthStart - dayStartDepth; + delta = delta > 0 ? delta : null; + SetCell(sheet.Row(0 + i + headerRowsCount), columnDeltaWellDepthPerDay, delta); + dayStartDepth = tvdItem.Fact.DepthStart; + dayNum = tvdItem.Fact.DateStart.DayOfYear; + } + } + + SetCell(row, columnDurationPlan, tvdItem.Plan?.DurationHours); + SetCell(row, columnDurationFact, tvdItem.Fact?.DurationHours); + SetCell(row, columnDurationPredict, tvdItem.Predict?.DurationHours); + + SetCell(row, columnDateEndPlan, tvdItem.Plan?.DateStart.AddHours(tvdItem.Plan?.DurationHours ?? 0)); + SetCell(row, columnDateEndFact, tvdItem.Fact?.DateStart.AddHours(tvdItem.Fact?.DurationHours ?? 0)); + SetCell(row, columnDateEndPredict, tvdItem.Predict?.DateStart.AddHours(tvdItem.Predict?.DurationHours ?? 0)); + + if (tvdItem.Fact?.IdCategory == WellOperationService.idOperationNonProductiveTime) + { + SetCell(row, columnGuilty, tvdItem.Fact.Comment); + SetCell(row, columnNpt, tvdItem.Fact.DurationHours); + row.Row(columnRowNumber, columnNpt).Style.Fill.BackgroundColor = XLColor.Red; + } + else + { + SetCell(row, columnGuilty, null); + SetCell(row, columnNpt, null); + } + } + + var rowNumSummary = 1 + i + headerRowsCount; + var rowNumStart = 1 + headerRowsCount; + var rowNumEnd = i + headerRowsCount; + + string MakeRangeFunction(string funcName, int column) + => $"={funcName}({GetColunmLetter(column)}{rowNumStart}:{GetColunmLetter(column)}{rowNumEnd})"; + + IXLCell AddRangeFormula(IXLRow row, string funcName, int column) + { + var cell = row.Cell(column); + cell.FormulaA1 = MakeRangeFunction(funcName, column); + return cell; + } + + var rowSummary = sheet.Row(rowNumSummary); + rowSummary.Style.Font.Bold = true; + rowSummary.Cell(columnCaption).Value = "Итого:"; + + AddRangeFormula(rowSummary, "sum", columnDeltaWellDepthPerDay); + AddRangeFormula(rowSummary, "sum", columnDurationPlan); + AddRangeFormula(rowSummary, "sum", columnDurationFact); + var cell = AddRangeFormula(rowSummary, "max", columnDateEndPlan); + SetDateTime(cell); + cell = AddRangeFormula(rowSummary, "max", columnDateEndFact); + SetDateTime(cell); + AddRangeFormula(rowSummary, "sum", columnNpt); + SetBorder(rowSummary.Cells(true).Style); + + var rowSummary2 = sheet.Row(rowNumSummary + 1); + rowSummary2.DataType = XLDataType.Number; + rowSummary2.Style.NumberFormat.Format = "0,00"; + rowSummary2.Cell(columnCaption).Value = "в сутках:"; + rowSummary2.Cell(columnDurationPlan).FormulaA1 = $"={GetColunmLetter(columnDurationPlan)}{rowNumSummary}/24"; + SetNumber(rowSummary2.Cell(columnDurationPlan)); + rowSummary2.Cell(columnDurationFact).FormulaA1 = $"={GetColunmLetter(columnDurationFact)}{rowNumSummary}/24"; + SetNumber(rowSummary2.Cell(columnDurationFact)); + rowSummary2.Cell(columnNpt).FormulaA1 = $"={GetColunmLetter(columnNpt)}{rowNumSummary}/24"; + SetNumber(rowSummary2.Cell(columnNpt)); + SetBorder(rowSummary2.Cells(true).Style); + } + + private void FillTvdSheetToWorkbook(XLWorkbook workbook, IEnumerable> tvd, WellDto well) + { + var sheet = workbook.Worksheets.FirstOrDefault(ws => ws.Name == sheetNameTvd); + if (sheet is null) + return; + + const int rowTitle = 2; + const int rowSubtitle = 3; + const int colTitle = 5; + + const int rowTopStatTitle = 2; + const int colTopStatvalue = 10; + + const int colBottomStatvalue = 3; + const int rowStartDateFact = 43; + const int rowEndDatePlan = 44; + const int rowEndDateFact = 45; + + sheet.Row(rowSubtitle).Cell(colTitle).Value + = $"скважины №{well.Caption}, куст: {well.Cluster}, м/р: {well.Deposit}"; + + SetCell(sheet.Row(rowTitle), colTopStatvalue, DateTime.Now); + + var Plan = tvd.Where(t => t.Plan is not null) + .Select(t => t.Plan); + var Fact = tvd.Where(t => t.Fact is not null) + .Select(t => t.Fact); + var Predict = tvd.Where(t => t.Predict is not null) + .Select(t => t.Predict); + + var startDateFact = Fact.FirstOrDefault()?.DateStart; + var planLast = Plan.LastOrDefault(); + var factLast = Fact.LastOrDefault(); + var predictLast = Predict.LastOrDefault(); + + DateTime GetEndDate(WellOperationDto operation) + => operation is not null + ? operation.DateStart.AddHours(operation.DurationHours) + : default; + + var endDatePlan = GetEndDate(planLast); + var endDateFact = GetEndDate(factLast); + var endDatePredict = GetEndDate(predictLast); + + var endDate = endDatePredict > endDateFact + ? endDatePredict + : endDateFact; + + if(startDateFact is not null) + { + SetCell(sheet.Row(rowStartDateFact), colBottomStatvalue, startDateFact); + SetCell(sheet.Row(rowEndDatePlan), colBottomStatvalue, endDatePlan); + SetCell(sheet.Row(rowEndDateFact), colBottomStatvalue, endDate); + if(endDate != default) + { + var deltaEndDate = (endDatePlan - endDate).TotalDays; + SetCell(sheet.Row(rowTopStatTitle + 1), colTopStatvalue, Math.Abs(deltaEndDate)); + if(deltaEndDate >= 0) + SetCell(sheet.Row(rowTopStatTitle + 1), colTopStatvalue - 1, "+") + .Style.Font.SetFontColor(XLColor.Green); + else + SetCell(sheet.Row(rowTopStatTitle + 1), colTopStatvalue - 1, "-") + .Style.Font.SetFontColor(XLColor.Red); + } + } + } + + private static string GetColunmLetter(int columnNumber) + { + string letter = ""; + + while (columnNumber > 0) + { + int modulo = (columnNumber - 1) % 26; + letter = Convert.ToChar('A' + modulo) + letter; + columnNumber = (columnNumber - modulo) / 26; + } + + return letter; + } + + private static IXLStyle SetBorder(IXLStyle style) + { + style.Border.RightBorder = XLBorderStyleValues.Thin; + style.Border.LeftBorder = XLBorderStyleValues.Thin; + style.Border.TopBorder = XLBorderStyleValues.Thin; + style.Border.BottomBorder = XLBorderStyleValues.Thin; + style.Border.InsideBorder = XLBorderStyleValues.Thin; + return style; + } + + private static IXLCell SetDateTime(IXLCell cell) + { + cell.DataType = XLDataType.DateTime; + cell.Style.DateFormat.Format = "DD.MM.YYYY HH:MM:SS"; + return cell; + } + + private static IXLCell SetNumber(IXLCell cell) + { + cell.DataType = XLDataType.Number; + cell.Style.NumberFormat.Format = "0.00"; + return cell; + } + + private static IXLCell SetCell(IXLRow row, int colunm, object value) + { + var cell = row.Cell(colunm); + cell.Value = value; + + SetBorder(cell.Style); + cell.Style.Alignment.WrapText = true; + + if (value is string valueString && valueString.Length > maxChartsToWrap) + { + var baseHeight = row.Height; + row.Height = Math.Ceiling(0.85d * valueString.Length / maxChartsToWrap) * baseHeight; + } + + if (value is DateTime) + { + SetDateTime(cell); + } + else if (value is IFormattable) + { + SetNumber(cell); + } + + return cell; + } + + private static Stream GetExcelTemplateStream() + { + var stream = System.Reflection.Assembly.GetExecutingAssembly() + .GetManifestResourceStream("AsbCloudInfrastructure.Services.WellOperationService.ScheduleReportTemplate.xlsx"); + return stream; + } + } +} diff --git a/AsbCloudInfrastructure/Services/WellOperationService/ScheduleReportTemplate.xlsx b/AsbCloudInfrastructure/Services/WellOperationService/ScheduleReportTemplate.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d7ce54eda1e8844832241fc15a74baf843120d6a GIT binary patch literal 15221 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∓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 }v-k)hh_ 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 + /// Создает excel файл с "сетевым графиком" + /// + /// id скважины + /// + /// Токен отмены задачи + /// Запрашиваемый файл + [HttpGet] + [Route("scheduleReport")] + [Permission] + [ProducesResponseType(typeof(PhysicalFileResult), (int)System.Net.HttpStatusCode.OK)] + public async Task ScheduleReportAsync([FromRoute] int idWell, [FromServices]IScheduleReportService scheduleReportService, CancellationToken token = default) + { + int? idCompany = User.GetCompanyId(); + + if (idCompany is null) + return Forbid(); + + if (!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, + idWell, token).ConfigureAwait(false)) + return Forbid(); + + var stream = await scheduleReportService.MakeReportAsync(idWell, token); + var fileName = await wellService.GetWellCaptionByIdAsync(idWell, token) + "_ScheduleReport.xlsx"; + return File(stream, "application/octet-stream", fileName); + } + /// /// Возвращает шаблон файла импорта /// diff --git a/ConsoleApp1/Program.cs b/ConsoleApp1/Program.cs index 48a4eb54..3e180ff9 100644 --- a/ConsoleApp1/Program.cs +++ b/ConsoleApp1/Program.cs @@ -9,6 +9,11 @@ using Google.Apis.Drive.v3.Data; using Microsoft.EntityFrameworkCore; using System.Net.Mail; using System.Text.RegularExpressions; +using AsbCloudInfrastructure.Services.WellOperationService; +using AsbCloudInfrastructure.Services.Cache; +using AsbCloudInfrastructure.Services; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Primitives; namespace ConsoleApp1 { @@ -17,15 +22,57 @@ namespace ConsoleApp1 // .Options; //var context = new AsbCloudDbContext(options); + class ConfigurationService : IConfigurationSection + { + public string this[string key] { get => "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True"; + set{} } + + public string Key => ""; + + public string Path => ""; + + public string Value { get; set; } = "Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True"; + + public IEnumerable GetChildren() + { + return null; + } + + public IChangeToken GetReloadToken() + { + return null; + } + + public IConfigurationSection GetSection(string key) => this; + + } + class Program { - + static void Main(/*string[] args*/) { - var regex = new Regex(@"<[a-zA-Z0-9]+.*>.*<[a-zA-Z]+/*>"); - var testHtml = "aa

AAA

asdasd"; - var t = regex.IsMatch(testHtml); + var options = new DbContextOptionsBuilder() + .UseNpgsql("Host=localhost;Database=postgres;Username=postgres;Password=q;Persist Security Info=True") + .Options; + var db = new AsbCloudDbContext(options); + var cacheDb = new CacheDb(); + + AsbCloudInfrastructure.DependencyInjection.MapsterSetup(); + var configService = new ConfigurationService(); + var telemetryTracker = new TelemetryTracker(cacheDb, configService); + var timeZoneService = new TimezoneService(); + var telemetryService = new TelemetryService(db, telemetryTracker, timeZoneService, cacheDb); + var wellService = new WellService(db, cacheDb, telemetryService, timeZoneService); + var operationService = new OperationsStatService(db, cacheDb, wellService); + var scheduleReportService = new ScheduleReportService(operationService, wellService); + var stream = scheduleReportService.MakeReportAsync(4).Result; + var outStream = System.IO.File.OpenWrite(@"c:\temp\1.xlsx"); + stream.CopyTo(outStream); + outStream.Flush(); + outStream.Close(); + return; //SendMail.Main(); //DbDemoDataService.AddDemoData();