Report logic

This commit is contained in:
RavilGismatullin 2024-08-15 15:59:47 +04:00
parent ea69b16468
commit 9bcec875a0
19 changed files with 944 additions and 4 deletions

View File

@ -0,0 +1,97 @@
using DocumentFormat.OpenXml.Office.CustomUI;
using PdfSharp.Pdf;
using ServiceSourceBusinessLogic.OfficePackage;
using ServiceSourceBusinessLogic.OfficePackage.HelperModels;
using ServiceStationContracts.BindingModels;
using ServiceStationContracts.BusinessLogic;
using ServiceStationContracts.SearchModels;
using ServiceStationContracts.ViewModels;
using ServiceStationsContracts.StorageContracts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.BusinessLogic {
public class ReportLogic : IReportLogic {
private readonly IWorkStorage _workStorage;
private readonly ITaskStorage _taskStorage;
private readonly IClientStorage _clientStorage;
private readonly AbstractSaveToExcel _saveToExcel;
private readonly AbstractSaveToPdf _saveToPdf;
private readonly AbstractSaveToWord _saveToWord;
public ReportLogic(IWorkStorage workStorage, ITaskStorage taskStorage, IClientStorage clientStorage,
AbstractSaveToExcel saveToExcel, AbstractSaveToPdf saveToPdf, AbstractSaveToWord saveToWord) {
_workStorage = workStorage;
_taskStorage = taskStorage;
_clientStorage = clientStorage;
_saveToExcel = saveToExcel;
_saveToPdf = saveToPdf;
_saveToWord = saveToWord;
}
public List<ReportClientsInWorksViewModel> GetClientListInWorks(ReportBindeingModel model) {
List<ReportClientsInWorksViewModel> client_list_in_works = new();
foreach (int id in model.ids) {
var work = _workStorage.GetElement(new WorkSearchModel { Id = id }) ?? throw new Exception("Ошибка получения данных");
var record = new ReportClientsInWorksViewModel {
WorkId = work.Id,
Date = work.Date.ToShortDateString(),
Price = work.Price,
TotalCount = 0,
_Clients = new()
};
foreach (var client in work.ClientList) {
record._Clients.Add(new(client.Key, client.Value.FIO));
record.TotalCount++;
}
client_list_in_works.Add(record);
}
return client_list_in_works;
}
public byte[]? SaveToExcelFile(ReportBindeingModel model) {
var document = _saveToExcel.CreateReport(new ExcelInfo {
Title = "Список клиентов по выбранным работам",
WorksClients = GetClientListInWorks(model)
});
return document;
}
public PdfDocument SaveToPdfFile(ReportBindeingModel model) {
var works = _workStorage.GetFilteredList(new WorkSearchModel { DateFrom = model.DateFrom, DateTo = model.DateTo });
var record = new PdfInfo {
Title = "Список работ и назначенных заданий",
Date_From = model.DateFrom.ToShortDateString(),
Date_To = model.DateTo.ToShortDateString(),
WorkTask = new(),
TotalCount = 0,
};
foreach (var work in works) {
var task = _taskStorage.GetElement(new TaskSearchModel { Id = work.TaskId }) ?? throw new Exception("Ошибка получения данных");
record.WorkTask.Add(new(work.Id, work.Date.ToShortDateString(), work.Price, task.Id, task.Name));
record.TotalCount++;
}
var document = _saveToPdf.CreateDoc(record);
return document;
}
public byte[]? SaveToWordFile(ReportBindeingModel model) {
var document = _saveToWord.CreateDoc(new WordInfo {
Title = "Список клиентов по выбранным работам",
WorksClients = GetClientListInWorks(model)
});
return document;
}
}
}

View File

@ -0,0 +1,125 @@
using ServiceSourceBusinessLogic.OfficePackage.HelperEnums;
using ServiceSourceBusinessLogic.OfficePackage.HelperModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage
{
public abstract class AbstractSaveToExcel {
public byte[]? CreateReport(ExcelInfo info) {
CreateExcel(info);
InsertCellInWorksheet(new ExcelCellParameters {
ColumnName = "A",
RowIndex = 1,
Text = info.Title,
StyleInfo = ExcelStyleInfoType.Title
});
MergeCells(new ExcelMergeParameters {
CellFromName = "A1",
CellToName = "C1"
});
uint rowIndex = 2;
foreach (var work_client in info.WorksClients) {
InsertCellInWorksheet(new ExcelCellParameters {
ColumnName = "A",
RowIndex = rowIndex,
Text = $"Номер работы: {work_client.WorkId}",
StyleInfo = ExcelStyleInfoType.Text
});
MergeCells(new ExcelMergeParameters {
CellFromName = $"A{rowIndex}",
CellToName = $"B{rowIndex}"
});
InsertCellInWorksheet(new ExcelCellParameters {
ColumnName = "C",
RowIndex = rowIndex,
Text = $"Дата работы: {work_client.Date}",
StyleInfo = ExcelStyleInfoType.Text
});
MergeCells(new ExcelMergeParameters {
CellFromName = $"C{rowIndex}",
CellToName = $"D{rowIndex}"
});
InsertCellInWorksheet(new ExcelCellParameters {
ColumnName = "E",
RowIndex = rowIndex,
Text = $"Стоимость: {work_client.Price}",
StyleInfo = ExcelStyleInfoType.Text
});
MergeCells(new ExcelMergeParameters {
CellFromName = $"E{rowIndex}",
CellToName = $"F{rowIndex}"
});
rowIndex++;
foreach (var (client_id, client_fio) in work_client._Clients) {
InsertCellInWorksheet(new ExcelCellParameters {
ColumnName = "B",
RowIndex = rowIndex,
Text = $"Номер клиента: {client_id}",
StyleInfo = ExcelStyleInfoType.TextWithBorder
});
MergeCells(new ExcelMergeParameters {
CellFromName = $"B{rowIndex}",
CellToName = $"C{rowIndex}"
});
InsertCellInWorksheet(new ExcelCellParameters {
ColumnName = "D",
RowIndex = rowIndex,
Text = $"ФИО клиента: {client_fio}",
StyleInfo = ExcelStyleInfoType.TextWithBorder
});
MergeCells(new ExcelMergeParameters {
CellFromName = $"D{rowIndex}",
CellToName = $"E{rowIndex}"
});
rowIndex++;
}
InsertCellInWorksheet(new ExcelCellParameters {
ColumnName = "A",
RowIndex = rowIndex,
Text = $"Итого: {work_client.TotalCount}",
StyleInfo = ExcelStyleInfoType.Title
});
MergeCells(new ExcelMergeParameters {
CellFromName = $"A{rowIndex}",
CellToName = $"B{rowIndex}"
});
rowIndex++;
}
var document = SaveExcel(info);
return document;
}
// Создание excel-файла
protected abstract void CreateExcel(ExcelInfo info);
// Добавляем новую ячейку в лист
protected abstract void InsertCellInWorksheet(ExcelCellParameters excelCellParameters);
// Объединение ячеек
protected abstract void MergeCells(ExcelMergeParameters mergeParameters);
// Сохранение файла
protected abstract byte[]? SaveExcel(ExcelInfo info);
}
}

View File

@ -0,0 +1,74 @@
using PdfSharp.Pdf;
using ServiceSourceBusinessLogic.OfficePackage.HelperEnums;
using ServiceSourceBusinessLogic.OfficePackage.HelperModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage {
public abstract class AbstractSaveToPdf {
public PdfDocument CreateDoc (PdfInfo info) {
CreatePdf(info);
CreateParagraph(new PdfParagraph {
Text = info.Title,
Style = "NormalTitle",
alignmentType = PdfParagraphAlignmentType.Center,
});
CreateParagraph(new PdfParagraph {
Text = $"С {info.Date_From} по {info.Date_To}",
Style = "Normal",
alignmentType = PdfParagraphAlignmentType.Right,
});
CreateTable(new List<string> { "3cm", "4cm", "3cm", "2cm", "4cm" });
CreateRow(new PdfRowParameters {
Text = new List<string> { "Номер работы", "Дата работы", "Стоимость", "Номер задачи", "Название задачи" },
Style = "NormalTittle",
alignmentType = PdfParagraphAlignmentType.Left,
});
foreach (var rec in info.WorkTask) {
CreateRow(new PdfRowParameters {
Text = new List<string> {
rec.work_id.ToString(),
rec.work_date,
rec.work_price.ToString(),
rec.task_id.ToString(),
rec.task_name.ToString()
},
Style = "Normal",
alignmentType = PdfParagraphAlignmentType.Left,
});
}
CreateParagraph(new PdfParagraph {
Text = $"Итого: {info.TotalCount}",
Style = "Normal",
alignmentType = PdfParagraphAlignmentType.Right,
});
var document = SavePdf(info);
return document;
}
// Создание документа
protected abstract void CreatePdf(PdfInfo info);
// Создание параграфа с текстом
protected abstract void CreateParagraph(PdfParagraph paragraph);
// Создание таблицы
protected abstract void CreateTable(List<string> columns);
// Создание и заполнение строки
protected abstract void CreateRow(PdfRowParameters rowParameters);
// Сохранение файла
protected abstract PdfDocument SavePdf(PdfInfo info);
}
}

View File

@ -0,0 +1,73 @@
using ServiceSourceBusinessLogic.OfficePackage.HelperEnums;
using ServiceSourceBusinessLogic.OfficePackage.HelperModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage {
public abstract class AbstractSaveToWord {
public byte[]? CreateDoc(WordInfo info) {
CreateParagraph(new WordParagraph {
Texts = new List<(string, WordTextProperties)> { (info.Title, new WordTextProperties { Bold = true, Size = "24"})},
TextProperties = new WordTextProperties {
Size = "24",
JustificationType = WordJustificationType.Center,
}
});
foreach (var work_client in info.WorksClients) {
CreateParagraph(new WordParagraph {
Texts = new List<(string, WordTextProperties)> {($"Номера работы:{work_client.WorkId}/Дата:{work_client.Date}/" +
$"Сумма:{work_client.Price}", new WordTextProperties {
Bold = true, Size = "24"
})},
TextProperties = new WordTextProperties {
Size = "24",
JustificationType = WordJustificationType.Both
}
});
foreach (var client in work_client._Clients) {
CreateParagraph(new WordParagraph {
Texts = new List<(string, WordTextProperties)> {($"Номер клиента:{client.client_id}/ФИО клиента:{client.client_fio}",
new WordTextProperties {
Bold = false, Size = "24"
})},
TextProperties = new WordTextProperties {
Size = "24",
JustificationType = WordJustificationType.Both
}
});
}
CreateParagraph(new WordParagraph {
Texts = new List<(string, WordTextProperties)> {
($"Итого:{work_client.TotalCount}", new WordTextProperties {
Bold = true,
Size = "24"
})
},
TextProperties = new WordTextProperties {
Size = "24",
JustificationType = WordJustificationType.Both
}
});
}
var doucment = SaveWord(info);
return doucment;
}
// Создание документа
protected abstract void CreateWord(WordInfo info);
// Создание абзаца с текстом
protected abstract void CreateParagraph(WordParagraph paragraph);
// Сохранение файла
protected abstract byte[]? SaveWord(WordInfo info);
}
}

View File

@ -0,0 +1,13 @@
using ServiceStationContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage.HelperModels {
public class ExcelInfo {
public string Title { get; set; } = string.Empty;
public List<ReportClientsInWorksViewModel> WorksClients { get; set; } = new();
}
}

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage.HelperModels {
public class PdfInfo {
public string Title { get; set; } = string.Empty;
public string Date_From { get; set; } = string.Empty;
public string Date_To { get; set;} = string.Empty;
public List<(int work_id, string work_date, double work_price, int task_id, string task_name)> WorkTask { get; set; } = new();
public int TotalCount { get; set; }
}
}

View File

@ -0,0 +1,13 @@
using ServiceStationContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage.HelperModels {
public class WordInfo {
public string Title { get; set; } = string.Empty;
public List<ReportClientsInWorksViewModel> WorksClients { get; set; } = new();
}
}

View File

@ -0,0 +1,267 @@
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Office2010.Excel;
using DocumentFormat.OpenXml.Office2013.Excel;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using ServiceSourceBusinessLogic.OfficePackage.HelperEnums;
using ServiceSourceBusinessLogic.OfficePackage.HelperModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage.Implements {
public class SaveToExcek : AbstractSaveToExcel {
private SpreadsheetDocument? _spreadsheetDocument;
private SharedStringTablePart? _shareStringPart;
private Worksheet? _worksheet;
private MemoryStream _mem = new MemoryStream();
// Настройка стилей для файла
private static void CreateStyles(WorkbookPart workbookpart) {
var sp = workbookpart.AddNewPart<WorkbookStylesPart>();
sp.Stylesheet = new Stylesheet();
var fonts = new Fonts() { Count = 2U, KnownFonts = true };
var fontUsual = new Font();
fontUsual.Append(new FontSize() { Val = 12D });
fontUsual.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Theme = 1U });
fontUsual.Append(new FontName() { Val = "Times New Roman" });
fontUsual.Append(new FontFamilyNumbering() { Val = 2 });
fontUsual.Append(new FontScheme() { Val = FontSchemeValues.Minor });
var fontTitle = new Font();
fontTitle.Append(new Bold());
fontTitle.Append(new FontSize() { Val = 14D });
fontTitle.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Theme = 1U });
fontTitle.Append(new FontName() { Val = "Times New Roman" });
fontTitle.Append(new FontFamilyNumbering() { Val = 2 });
fontTitle.Append(new FontScheme() { Val = FontSchemeValues.Minor });
fonts.Append(fontUsual);
fonts.Append(fontTitle);
var fills = new Fills() { Count = 2U };
var fill1 = new Fill();
fill1.Append(new PatternFill() { PatternType = PatternValues.None });
var fill2 = new Fill();
fill2.Append(new PatternFill() { PatternType = PatternValues.Gray125 });
fills.Append(fill1);
fills.Append(fill2);
var borders = new Borders() { Count = 2U };
var borderNoBorder = new Border();
borderNoBorder.Append(new LeftBorder());
borderNoBorder.Append(new RightBorder());
borderNoBorder.Append(new TopBorder());
borderNoBorder.Append(new BottomBorder());
borderNoBorder.Append(new DiagonalBorder());
var borderThin = new Border();
var leftBorder = new LeftBorder() { Style = BorderStyleValues.Thin };
leftBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
var rightBorder = new RightBorder() { Style = BorderStyleValues.Thin };
rightBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
var topBorder = new TopBorder() { Style = BorderStyleValues.Thin };
topBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
var bottomBorder = new BottomBorder() { Style = BorderStyleValues.Thin };
bottomBorder.Append(new DocumentFormat.OpenXml.Office2010.Excel.Color() { Indexed = 64U });
borderThin.Append(leftBorder);
borderThin.Append(rightBorder);
borderThin.Append(topBorder);
borderThin.Append(bottomBorder);
borderThin.Append(new DiagonalBorder());
borders.Append(borderNoBorder);
borders.Append(borderThin);
var cellStyleFormats = new CellStyleFormats() { Count = 1U };
var cellFormatStyle = new CellFormat() { NumberFormatId = 0U, FontId = 0U, FillId = 0U, BorderId = 0U };
cellStyleFormats.Append(cellFormatStyle);
var cellFormats = new CellFormats() { Count = 3U };
var cellFormatFont = new CellFormat() { NumberFormatId = 0U, FontId = 0U, FillId = 0U, BorderId = 0U, FormatId = 0U, ApplyFont = true };
var cellFormatFontAndBorder = new CellFormat() { NumberFormatId = 0U, FontId = 0U, FillId = 0U, BorderId = 1U, FormatId = 0U, ApplyFont = true, ApplyBorder = true };
var cellFormatTitle = new CellFormat() { NumberFormatId = 0U, FontId = 1U, FillId = 0U, BorderId = 0U, FormatId = 0U, Alignment = new Alignment() { Vertical = VerticalAlignmentValues.Center, WrapText = true, Horizontal = HorizontalAlignmentValues.Center }, ApplyFont = true };
cellFormats.Append(cellFormatFont);
cellFormats.Append(cellFormatFontAndBorder);
cellFormats.Append(cellFormatTitle);
var cellStyles = new CellStyles() { Count = 1U };
cellStyles.Append(new CellStyle() { Name = "Normal", FormatId = 0U, BuiltinId = 0U });
var differentialFormats = new DocumentFormat.OpenXml.Office2013.Excel.DifferentialFormats() { Count = 0U };
var tableStyles = new TableStyles() { Count = 0U, DefaultTableStyle = "TableStyleMedium2", DefaultPivotStyle = "PivotStyleLight16" };
var stylesheetExtensionList = new StylesheetExtensionList();
var stylesheetExtension1 = new StylesheetExtension() { Uri = "{EB79DEF2-80B8-43e5-95BD-54CBDDF9020C}" };
stylesheetExtension1.AddNamespaceDeclaration("x14", "http://schemas.microsoft.com/office/spreadsheetml/2009/9/main");
stylesheetExtension1.Append(new SlicerStyles() { DefaultSlicerStyle = "SlicerStyleLight1" });
var stylesheetExtension2 = new StylesheetExtension() { Uri = "{9260A510-F301-46a8-8635-F512D64BE5F5}" };
stylesheetExtension2.AddNamespaceDeclaration("x15", "http://schemas.microsoft.com/office/spreadsheetml/2010/11/main");
stylesheetExtension2.Append(new TimelineStyles() { DefaultTimelineStyle = "TimeSlicerStyleLight1" });
stylesheetExtensionList.Append(stylesheetExtension1);
stylesheetExtensionList.Append(stylesheetExtension2);
sp.Stylesheet.Append(fonts);
sp.Stylesheet.Append(fills);
sp.Stylesheet.Append(borders);
sp.Stylesheet.Append(cellStyleFormats);
sp.Stylesheet.Append(cellFormats);
sp.Stylesheet.Append(cellStyles);
sp.Stylesheet.Append(differentialFormats);
sp.Stylesheet.Append(tableStyles);
sp.Stylesheet.Append(stylesheetExtensionList);
}
// Получение номера стиля из типа
private static uint GetStyleValue(ExcelStyleInfoType styleInfo) {
return styleInfo switch {
ExcelStyleInfoType.Title => 2U,
ExcelStyleInfoType.TextWithBorder => 1U,
ExcelStyleInfoType.Text => 0U,
_ => 0U,
};
}
protected override void CreateExcel(ExcelInfo info) {
_spreadsheetDocument = SpreadsheetDocument.Create(_mem, SpreadsheetDocumentType.Workbook);
// Создаем книгу (в ней хранятся листы)
var workbookpart = _spreadsheetDocument.AddWorkbookPart();
workbookpart.Workbook = new Workbook();
CreateStyles(workbookpart);
// Получаем/создаем хранилище текстов для книги
_shareStringPart = _spreadsheetDocument.WorkbookPart!.GetPartsOfType<SharedStringTablePart>().Any()
? _spreadsheetDocument.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First()
: _spreadsheetDocument.WorkbookPart.AddNewPart<SharedStringTablePart>();
// Создаем SharedStringTable, если его нет
if (_shareStringPart.SharedStringTable == null) {
_shareStringPart.SharedStringTable = new SharedStringTable();
}
// Создаем лист в книгу
var worksheetPart = workbookpart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData());
// Добавляем лист в книгу
var sheets = _spreadsheetDocument.WorkbookPart.Workbook.AppendChild(new Sheets());
var sheet = new Sheet() {
Id = _spreadsheetDocument.WorkbookPart.GetIdOfPart(worksheetPart),
SheetId = 1,
Name = "Лист"
};
sheets.Append(sheet);
_worksheet = worksheetPart.Worksheet;
}
protected override void InsertCellInWorksheet(ExcelCellParameters excelParams) {
if (_worksheet == null || _shareStringPart == null) {
return;
}
var sheetData = _worksheet.GetFirstChild<SheetData>();
if (sheetData == null) {
return;
}
// Ищем строку, либо добавляем ее
Row row;
if (sheetData.Elements<Row>().Where(r => r.RowIndex! == excelParams.RowIndex).Any()) {
row = sheetData.Elements<Row>().Where(r => r.RowIndex! == excelParams.RowIndex).First();
}
else {
row = new Row() { RowIndex = excelParams.RowIndex };
sheetData.Append(row);
}
// Ищем нужную ячейку
Cell cell;
if (row.Elements<Cell>().Where(c => c.CellReference!.Value == excelParams.CellReference).Any()) {
cell = row.Elements<Cell>().Where(c => c.CellReference!.Value == excelParams.CellReference).First();
}
else {
// Все ячейки должны быть последовательно друг за другом расположены
// нужно определить, после какой вставлять
Cell? refCell = null;
foreach (Cell rowCell in row.Elements<Cell>()) {
if (string.Compare(rowCell.CellReference!.Value, excelParams.CellReference, true) > 0) {
refCell = rowCell;
break;
}
}
var newCell = new Cell() { CellReference = excelParams.CellReference };
row.InsertBefore(newCell, refCell);
cell = newCell;
}
// вставляем новый текст
_shareStringPart.SharedStringTable.AppendChild(new SharedStringItem(new Text(excelParams.Text)));
_shareStringPart.SharedStringTable.Save();
cell.CellValue = new CellValue((_shareStringPart.SharedStringTable.Elements<SharedStringItem>().Count() - 1).ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
cell.StyleIndex = GetStyleValue(excelParams.StyleInfo);
}
protected override void MergeCells(ExcelMergeParameters excelParams) {
if (_worksheet == null) {
return;
}
MergeCells mergeCells;
if (_worksheet.Elements<MergeCells>().Any()) {
mergeCells = _worksheet.Elements<MergeCells>().First();
}
else {
mergeCells = new MergeCells();
if (_worksheet.Elements<CustomSheetView>().Any()) {
_worksheet.InsertAfter(mergeCells, _worksheet.Elements<CustomSheetView>().First());
}
else {
_worksheet.InsertAfter(mergeCells, _worksheet.Elements<SheetData>().First());
}
}
var mergeCell = new MergeCell() {
Reference = new StringValue(excelParams.Merge)
};
mergeCells.Append(mergeCell);
}
protected override byte[]? SaveExcel(ExcelInfo info) {
if (_spreadsheetDocument == null) {
return null;
}
_spreadsheetDocument.WorkbookPart!.Workbook.Save();
_spreadsheetDocument.Dispose();
return _mem.ToArray();
}
}
}

View File

@ -0,0 +1,96 @@
using MigraDoc.DocumentObjectModel;
using MigraDoc.DocumentObjectModel.Tables;
using MigraDoc.Rendering;
using PdfSharp.Pdf;
using ServiceSourceBusinessLogic.OfficePackage.HelperEnums;
using ServiceSourceBusinessLogic.OfficePackage.HelperModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage.Implements {
public class SaveToPdf : AbstractSaveToPdf {
private Document? _document;
private Section? _section;
private Table? _table;
private static ParagraphAlignment GetParagraphAlignment(PdfParagraphAlignmentType type) {
return type switch {
PdfParagraphAlignmentType.Center => ParagraphAlignment.Center,
PdfParagraphAlignmentType.Left => ParagraphAlignment.Left,
PdfParagraphAlignmentType.Right => ParagraphAlignment.Right,
_ => ParagraphAlignment.Justify
};
}
// Создание стилей для документа
private static void DefineStyles(Document document) {
var style = document.Styles["Normal"];
style.Font.Name = "Times New Roman";
style.Font.Size = 14;
style = document.Styles.AddStyle("NormalTitle", "Normal");
style.Font.Bold = true;
}
protected override void CreateParagraph(PdfParagraph pdfParagraph) {
if (_section == null) {
return;
}
var paragraph = _section.AddParagraph(pdfParagraph.Text);
paragraph.Format.SpaceAfter = "1cm";
paragraph.Format.Alignment = GetParagraphAlignment(pdfParagraph.alignmentType);
paragraph.Style = pdfParagraph.Style;
}
protected override void CreateRow(PdfRowParameters rowParameters) {
if (_table == null) {
return;
}
var row = _table.AddRow();
for (int i = 0; i < rowParameters.Text.Count; ++i) {
// заполнение ячейки (добавление параграфа в ячейку)
row.Cells[i].AddParagraph(rowParameters.Text[i]);
if (!string.IsNullOrEmpty(rowParameters.Style)) {
row.Cells[i].Style = rowParameters.Style;
}
Unit borderWidth = 0.5;
row.Cells[i].Borders.Left.Width = borderWidth;
row.Cells[i].Borders.Right.Width = borderWidth;
row.Cells[i].Borders.Top.Width = borderWidth;
row.Cells[i].Borders.Bottom.Width = borderWidth;
row.Cells[i].Format.Alignment = GetParagraphAlignment(rowParameters.alignmentType);
row.Cells[i].VerticalAlignment = VerticalAlignment.Center;
}
}
protected override void CreateTable(List<string> columns) {
if (_document == null) {
return;
}
_table = _document.LastSection.AddTable();
foreach (var elem in columns) {
_table.AddColumn(elem);
}
}
protected override void CreatePdf(PdfInfo info) {
_document = new Document();
DefineStyles(_document);
// Ссылка нп первую секцию
_section = _document.AddSection();
}
protected override PdfDocument SavePdf(PdfInfo info) {
var renderer = new PdfDocumentRenderer(true) {
Document = _document,
};
renderer.RenderDocument();
return renderer.PdfDocument;
}
}
}

View File

@ -0,0 +1,115 @@
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Wordprocessing;
using DocumentFormat.OpenXml;
using ServiceSourceBusinessLogic.OfficePackage.HelperEnums;
using ServiceSourceBusinessLogic.OfficePackage.HelperModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceSourceBusinessLogic.OfficePackage.Implements {
public class SaveToWord : AbstractSaveToWord {
private WordprocessingDocument? _wordDocument;
private Body? _docBody;
private MemoryStream _mem = new MemoryStream();
// Получение типа выравнивания
private static JustificationValues GetJustificationValues(WordJustificationType type) {
return type switch {
WordJustificationType.Both => JustificationValues.Both,
WordJustificationType.Center => JustificationValues.Center,
_ => JustificationValues.Left,
};
}
// Настройки страницы
private static SectionProperties CreateSectionProperties() {
var properties = new SectionProperties();
var pageSize = new PageSize {
Orient = PageOrientationValues.Portrait
};
properties.AppendChild(pageSize);
return properties;
}
// Задание форматирования для абзаца
private static ParagraphProperties? CreateParagraphProperties(WordTextProperties? paragraphProperties) {
if (paragraphProperties == null) {
return null;
}
var properties = new ParagraphProperties();
properties.AppendChild(new Justification() {
Val = GetJustificationValues(paragraphProperties.JustificationType)
});
properties.AppendChild(new SpacingBetweenLines {
LineRule = LineSpacingRuleValues.Auto
});
properties.AppendChild(new Indentation());
var paragraphMarkRunProperties = new ParagraphMarkRunProperties();
if (!string.IsNullOrEmpty(paragraphProperties.Size)) {
paragraphMarkRunProperties.AppendChild(new FontSize { Val = paragraphProperties.Size });
}
properties.AppendChild(paragraphMarkRunProperties);
return properties;
}
protected override void CreateWord(WordInfo info) {
_wordDocument = WordprocessingDocument.Create(_mem, WordprocessingDocumentType.Document);
MainDocumentPart mainPart = _wordDocument.AddMainDocumentPart();
mainPart.Document = new Document();
_docBody = mainPart.Document.AppendChild(new Body());
}
protected override void CreateParagraph(WordParagraph paragraph) {
if (_docBody == null || paragraph == null) {
return;
}
var docParagraph = new Paragraph();
docParagraph.AppendChild(CreateParagraphProperties(paragraph.TextProperties));
foreach (var run in paragraph.Texts) {
var docRun = new Run();
var properties = new RunProperties();
properties.AppendChild(new FontSize { Val = run.Item2.Size });
if (run.Item2.Bold) {
properties.AppendChild(new Bold());
}
docRun.AppendChild(properties);
docRun.AppendChild(new Text { Text = run.Item1, Space = SpaceProcessingModeValues.Preserve });
docParagraph.AppendChild(docRun);
}
_docBody.AppendChild(docParagraph);
}
protected override byte[]? SaveWord(WordInfo info) {
if (_docBody == null || _wordDocument == null) {
return null;
}
_docBody.AppendChild(CreateSectionProperties());
_wordDocument.MainDocumentPart!.Document.Save();
_wordDocument.Dispose();
return _mem.ToArray();
}
}
}

View File

@ -7,15 +7,15 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DocumentFormat.OpenXml" Version="3.1.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.1" /> <PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.1" />
<PackageReference Include="MigraDocCore.DocumentObjectModel" Version="1.3.65" />
<PackageReference Include="MigraDocCore.Rendering" Version="1.3.65" />
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ServiceStationContracts\ServiceStationContracts.csproj" /> <ProjectReference Include="..\ServiceStationContracts\ServiceStationContracts.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="OfficePackage\Implements\" />
</ItemGroup>
</Project> </Project>

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceStationContracts.BindingModels {
public class ReportBindeingModel {
public DateTime DateFrom { get; set; }
public DateTime DateTo { get; set; }
// Список выбранных работ
public List<int> ids { get; set; } = new();
}
}

View File

@ -0,0 +1,18 @@
using PdfSharp.Pdf;
using ServiceStationContracts.BindingModels;
using ServiceStationContracts.ViewModels;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceStationContracts.BusinessLogic {
public interface IReportLogic {
List<ReportClientsInWorksViewModel> GetClientListInWorks(ReportBindeingModel model);
byte[]? SaveToWordFile(ReportBindeingModel model);
byte[]? SaveToExcelFile(ReportBindeingModel model);
PdfDocument SaveToPdfFile(ReportBindeingModel model);
}
}

View File

@ -6,6 +6,10 @@
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<PackageReference Include="PdfSharp.MigraDoc.Standard" Version="1.51.15" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\ServiceStationDataModels\ServiceStationDataModels.csproj" /> <ProjectReference Include="..\ServiceStationDataModels\ServiceStationDataModels.csproj" />
</ItemGroup> </ItemGroup>

View File

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ServiceStationContracts.ViewModels {
public class ReportClientsInWorksViewModel {
public int WorkId { get; set; }
public string Date { get; set; } = string.Empty;
public double Price { get; set; }
public int TotalCount { get; set; }
public List<(int client_id, string client_fio)> _Clients { get; set; } = new();
}
}