DD.WellWorkover.Cloud/AsbCloudInfrastructure/Services/DrillingProgram/TitleListSheet.cs

163 lines
5.3 KiB
C#
Raw Permalink Normal View History

using AsbCloudApp.Data;
using ClosedXML.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
2024-08-19 10:01:07 +05:00
namespace AsbCloudInfrastructure.Services.DrillingProgram;
2024-08-19 10:01:07 +05:00
public class TitleListSheet
{
private const string directionDirectorPositionName = "Руководитель направления по ТСБ";
2024-08-19 10:01:07 +05:00
private readonly DateTimeOffset totalDate;
private readonly FileMarkDto? acceptDirectionDirector;
private readonly List<FileMarkDto> acceptsOthers;
private readonly WellDto well;
2024-08-19 10:01:07 +05:00
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;
}
2024-08-19 10:01:07 +05:00
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;
}
2024-08-19 10:01:07 +05:00
private void DrawTopRightSign(IXLWorksheet sheet)
{
if (acceptDirectionDirector?.User is null)
return;
2024-08-19 10:01:07 +05:00
var user = acceptDirectionDirector.User;
2024-08-19 10:01:07 +05:00
sheet.Cell(1, 5)
.SetValue("Согласовано:");
2024-08-19 10:01:07 +05:00
sheet.Cell(2, 5)
.SetValue(user.Position);
2024-08-19 10:01:07 +05:00
sheet.Cell(3, 5)
.SetValue(user.Company?.Caption);
2024-08-19 10:01:07 +05:00
sheet.Cell(4, 5)
.SetValue($"{user.Surname} {user.Name} {user.Patronymic}");
2024-08-19 10:01:07 +05:00
sheet.Cell(5, 5)
.SetValue(FormatDate(acceptDirectionDirector.DateCreated));
2024-08-19 10:01:07 +05:00
sheet.Range(1,5, 5,5).Style.Alignment
.SetHorizontal(XLAlignmentHorizontalValues.Right);
}
2024-08-19 10:01:07 +05:00
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 =
{
2024-08-19 10:01:07 +05:00
(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 static void DrawAccept(IXLWorksheet sheet, FileMarkDto mark, (int row, int col) startAddress)
{
var user = mark.User;
if(user is null)
return;
int startRow = startAddress.row;
int startCol = startAddress.col;
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);
}
2024-08-19 10:01:07 +05:00
private static string FormatDate(DateTimeOffset dateTime)
=> $"{dateTime.Day:00}.{dateTime.Month:00}.{dateTime.Year:00}";
}