Add title and content lists to drillingProgram

This commit is contained in:
ngfrolov 2022-07-06 17:24:09 +05:00
parent 8117ac3a06
commit 4963e820c6
5 changed files with 213 additions and 2 deletions

View File

@ -0,0 +1,41 @@
using AsbCloudApp.Data;
using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AsbCloudInfrastructure.Services.DrillingProgram
{
#nullable enable
public class ContentListSheet
{
private readonly List<DrillingProgramPartDto> parts;
public ContentListSheet(IEnumerable<DrillingProgramPartDto> parts)
{
this.parts = parts.ToList();
}
public void Draw(IXLWorksheet sheet)
{
sheet.Style.Font.FontName = "Calibri";
sheet.Style.Font.FontSize = 12;
sheet.Cell(2, 2)
.SetValue("Содержание")
.Style
.Font.SetBold(true)
.Font.SetFontSize(14);
for (int i = 0; i < parts.Count; i++)
{
sheet.Cell(4 + i, 1)
.SetValue(i + 1);
sheet.Cell(4 + i, 2)
.SetValue(parts[i].Name);
}
}
}
#nullable disable
}

View File

@ -10,10 +10,19 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
{
private const int maxAllowedColumns = 256;
public static void UniteExcelFiles(IEnumerable<string> excelFilesNames, string resultExcelPath)
public static void UniteExcelFiles(IEnumerable<string> excelFilesNames, string resultExcelPath, IEnumerable<AsbCloudApp.Data.DrillingProgramPartDto> parts, AsbCloudApp.Data.WellDto well)
{
var resultExcelFile = new XLWorkbook(XLEventTracking.Disabled);
var titleSheet = resultExcelFile.AddWorksheet("Титульный лист");
var marks = parts.SelectMany(p => p.File.FileMarks);
var titleSheetMaker = new TitleListSheet(marks, well);
titleSheetMaker.Draw(titleSheet);
var contentSheet = resultExcelFile.AddWorksheet("Содержание");
var contentListSheetMaker = new ContentListSheet(parts);
contentListSheetMaker.Draw(contentSheet);
var filteredFileNames = excelFilesNames.Distinct();
foreach (var excelFileName in filteredFileNames)

View File

@ -109,6 +109,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
var partEntities = await context.DrillingProgramParts
.Include(p => p.RelatedUsers)
.ThenInclude(r => r.User)
.ThenInclude(u => u.Company)
.Where(p => p.IdWell == idWell)
.ToListAsync(token);
@ -481,7 +482,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
using var context = new AsbCloudDbContext(contextOptions);
var fileService = new FileService(context);
var files = state.Parts.Select(p => fileService.GetUrl(p.File));
DrillingProgramMaker.UniteExcelFiles(files, tempResultFilePath);
DrillingProgramMaker.UniteExcelFiles(files, tempResultFilePath, state.Parts, well);
await fileService.MoveAsync(idWell, null, idFileCategoryDrillingProgram, resultFileName, tempResultFilePath, token);
}

View File

@ -0,0 +1,160 @@
using AsbCloudApp.Data;
using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
namespace AsbCloudInfrastructure.Services.DrillingProgram
{
#nullable enable
public class TitleListSheet
{
private const string directionDirectorPositionName = "Руководитель направления по ТСБ";
private readonly DateTime totalDate;
private readonly FileMarkDto? acceptDirectionDirector;
private readonly List<FileMarkDto> acceptsOthers;
private readonly WellDto well;
public TitleListSheet(IEnumerable<FileMarkDto> fileMarks, WellDto well)
{
totalDate = fileMarks.Max(f => f.DateCreated);
acceptDirectionDirector = fileMarks
.OrderByDescending(f => f.DateCreated)
.FirstOrDefault(f => f.User.Position == directionDirectorPositionName);
acceptsOthers = fileMarks
.Where(f => f.Id != acceptDirectionDirector?.Id)
.OrderBy(f => f.DateCreated)
.ToList();
this.well = well;
}
public void Draw(IXLWorksheet sheet)
{
const double santimetr = 0.393701;
sheet.Style.Font.FontName = "Calibri";
sheet.Style.Font.FontSize = 12;
sheet.PageSetup.PaperSize = XLPaperSize.A4Paper;
sheet.PageSetup.Margins
.SetTop(santimetr)
.SetLeft(2 * santimetr)
.SetBottom(santimetr)
.SetRight(santimetr);
DrawTopRightSign(sheet);
DrawMainTilte(sheet);
DrawOtherAcceptors(sheet);
sheet.Range(51, 1, 51, 5)
.Merge()
.SetValue($"{totalDate.Year:00}")
.Style.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center);
var k = 4.95867768595041;
sheet.Column(1).Width = k*2.3;
sheet.Column(2).Width = k*6;
sheet.Column(3).Width = k*0.53;
sheet.Column(4).Width = k*2.3;
sheet.Column(5).Width = k*6;
}
private void DrawTopRightSign(IXLWorksheet sheet)
{
if (acceptDirectionDirector is null)
return;
var user = acceptDirectionDirector.User;
sheet.Cell(1, 5)
.SetValue("Согласовано:");
sheet.Cell(2, 5)
.SetValue(user.Position);
sheet.Cell(3, 5)
.SetValue(user.Company?.Caption);
sheet.Cell(4, 5)
.SetValue($"{user.Surname} {user.Name} {user.Patronymic}");
sheet.Cell(5, 5)
.SetValue(FormatDate(acceptDirectionDirector.DateCreated));
sheet.Range(1,5, 5,5).Style.Alignment
.SetHorizontal(XLAlignmentHorizontalValues.Right);
}
private void DrawMainTilte(IXLWorksheet sheet)
{
sheet.Range(11, 1, 11, 5)
.Merge()
.SetValue($"Программа на бурение скважины №{well.Caption}, куст №{well.Cluster}");
sheet.Range(12, 1, 12, 5)
.Merge()
.SetValue($"{well.Deposit} месторождения");
sheet.Range(11, 1, 12, 5).Style
.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Center)
.Font.SetFontSize(14)
.Font.SetBold(true);
}
private void DrawOtherAcceptors(IXLWorksheet sheet)
{
const int baseRow = 16;
const int deltaRow = 7;
(int row, int col)[] addresses =
{
(baseRow + 4 * deltaRow, 4), (baseRow + 4 * deltaRow, 1),
(baseRow + 3 * deltaRow, 4), (baseRow + 3 * deltaRow, 1),
(baseRow + 2 * deltaRow, 4), (baseRow + 2 * deltaRow, 1),
(baseRow + 1 * deltaRow, 4), (baseRow + 1 * deltaRow, 1),
(baseRow + 0 * deltaRow, 4), (baseRow + 0 * deltaRow, 1),
};
var i = 0;
for (; i < acceptsOthers.Count && i < 10; i++)
DrawAccept(sheet, acceptsOthers[i], addresses[i]);
sheet.Cell(addresses[i-1].row - 2, 1)
.SetValue("Утверждаю:");
}
private void DrawAccept(IXLWorksheet sheet, FileMarkDto mark, (int row, int col) startAddress)
{
int startRow = startAddress.row;
int startCol = startAddress.col;
var user = mark.User;
sheet.Cell(startRow, startCol)
.SetValue("Должность");
sheet.Range(startRow, startCol + 1, startRow + 1, startCol + 1)
.Merge()
.SetValue(user.Position);
sheet.Cell(startRow + 2, startCol)
.SetValue("Компания");
sheet.Range(startRow + 2, startCol + 1, startRow + 3, startCol + 1)
.Merge()
.SetValue(user.Company?.Caption);
sheet.Range(startRow + 4, startCol, startRow + 4, startCol + 1)
.Merge()
.SetValue($"{user.Surname} {user.Name} {user.Patronymic}");
sheet.Range(startRow + 5, startCol, startRow + 5, startCol + 1)
.Merge()
.SetValue(FormatDate(mark.DateCreated));
sheet.Range(startRow, startCol, startRow + 5, startCol + 1)
.Style.Border.SetOutsideBorder(XLBorderStyleValues.Thin)
.Alignment.SetVertical(XLAlignmentVerticalValues.Top)
.Alignment.SetHorizontal(XLAlignmentHorizontalValues.Left);
}
private static string FormatDate(DateTime dateTime)
=> $"{dateTime.Day:00}.{dateTime.Month:00}.{dateTime.Year:00}";
}
#nullable disable
}