фиксики + сдано

This commit is contained in:
Алексей Тихоненков 2024-10-29 16:20:42 +04:00
parent fef40a6aa8
commit b0fbcad227
2 changed files with 109 additions and 47 deletions

View File

@ -21,6 +21,7 @@ using ComponentsLibraryNet60.Models;
using FormLibrary.HelperClasses; using FormLibrary.HelperClasses;
using FormLibrary; using FormLibrary;
using ComponentsLibraryNet60.DocumentWithChart; using ComponentsLibraryNet60.DocumentWithChart;
using Microsoft.Win32;
namespace Lab3Form namespace Lab3Form
{ {
@ -81,7 +82,7 @@ namespace Lab3Form
var service = Program.ServiceProvider?.GetService(typeof(FormOrder)); var service = Program.ServiceProvider?.GetService(typeof(FormOrder));
if (service is FormOrder form) if (service is FormOrder form)
{ {
form.Id = controlDataTable.GetSelectedObject<OrderSearchModel>().Id ?? 0; form._id = controlDataTable.GetSelectedObject<OrderSearchModel>().Id;
if (form.ShowDialog() == DialogResult.OK) if (form.ShowDialog() == DialogResult.OK)
{ {
LoadData(); LoadData();
@ -116,54 +117,53 @@ namespace Lab3Form
{ {
try try
{ {
// Получаем заказы из логики
var orders = _logic.ReadList(null); var orders = _logic.ReadList(null);
// Создаем список таблиц для PDF
var orderTables = new List<string[,]>(); var orderTables = new List<string[,]>();
foreach (var order in orders) foreach (var order in orders)
{ {
// Получаем количество строк для таблицы на основе количества статусов
int rowCount = order.OrderStatusHistory.Count; int rowCount = order.OrderStatusHistory.Count;
// Создаем таблицу с числом строк, равным количеству статусов, и четырьмя колонками
// +1 строка для заголовков
string[,] orderTable = new string[rowCount+1, 4]; string[,] orderTable = new string[rowCount+1, 4];
// Первая строка — заголовок
orderTable[0, 0] = "Статус"; orderTable[0, 0] = "Статус";
orderTable[0, 1] = "Идентификатор заказа"; orderTable[0, 1] = "Идентификатор заказа";
orderTable[0, 2] = "Город назначения"; orderTable[0, 2] = "Город назначения";
orderTable[0, 3] = "Дата доставки"; orderTable[0, 3] = "Дата доставки";
// Заполняем строки таблицы статусами и данными о заказе
for (int i = 0; i < rowCount; i++) for (int i = 0; i < rowCount; i++)
{ {
orderTable[i+1, 0] = order.OrderStatusHistory[i]; // Статус заказа orderTable[i+1, 0] = order.OrderStatusHistory[i];
orderTable[i+1, 1] = order.Id.ToString(); // Имя заказчика orderTable[i+1, 1] = order.Id.ToString();
orderTable[i+1, 2] = order.DestinationCityName; // Город назначения orderTable[i+1, 2] = order.DestinationCityName;
orderTable[i+1, 3] = order.ExpectedDeliveryDate.ToString("yyyy-MM-dd"); // Дата доставки orderTable[i+1, 3] = order.ExpectedDeliveryDate.ToString("yyyy-MM-dd");
} }
// Добавляем таблицу заказа в список
orderTables.Add(orderTable); orderTables.Add(orderTable);
} }
// Запрашиваем у пользователя путь и имя файла для сохранения
using (SaveFileDialog saveFileDialog = new SaveFileDialog()) using (System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog())
{ {
saveFileDialog.Filter = "PDF files (*.pdf)|*.pdf|All files (*.*)|*.*"; saveFileDialog.Filter = "PDF files (*.pdf)|*.pdf|All files (*.*)|*.*";
saveFileDialog.Title = "Сохранить PDF-документ"; saveFileDialog.Title = "Сохранить PDF-документ";
saveFileDialog.FileName = "Отчет1.pdf"; // Имя по умолчанию saveFileDialog.FileName = "Отчет1.pdf";
if (saveFileDialog.ShowDialog() == DialogResult.OK) if (saveFileDialog.ShowDialog() == DialogResult.OK)
{ {
// Создаем PDF данные с указанным пользователем путем
var pdfData = new PdfDocumentData( var pdfData = new PdfDocumentData(
saveFileDialog.FileName, // Используем выбранный путь и имя файла saveFileDialog.FileName,
"Отчет по заказам", "Отчет по заказам",
orderTables // Передаем список таблиц в PDF-данные orderTables
); );
var documentGenerator = new PDFTable(); var documentGenerator = new PDFTable();
@ -181,7 +181,7 @@ namespace Lab3Form
private void buttonCreateOrderReport_Click(object sender, EventArgs e) private void buttonCreateOrderReport_Click(object sender, EventArgs e)
{ {
// Получаем список заказов из логики
var orders = _logic.ReadList(null); var orders = _logic.ReadList(null);
if (orders == null || orders.Count == 0) if (orders == null || orders.Count == 0)
{ {
@ -189,7 +189,7 @@ namespace Lab3Form
return; return;
} }
// Подготовка данных для Excel
var tableData = new List<OrderExcelViewModel>(); var tableData = new List<OrderExcelViewModel>();
foreach (var order in orders) foreach (var order in orders)
{ {
@ -197,53 +197,57 @@ namespace Lab3Form
{ {
tableData.Add(new OrderExcelViewModel( tableData.Add(new OrderExcelViewModel(
order.Id, order.Id,
order.Fullname, order.Fullname,
//order.DestinationCityId,
order.DestinationCityName, order.DestinationCityName,
order.ExpectedDeliveryDate order.ExpectedDeliveryDate
)); ));
} }
} }
// Определение параметров для Excel
string path = AppDomain.CurrentDomain.BaseDirectory + "OrderReport.xlsx"; string path = AppDomain.CurrentDomain.BaseDirectory + "OrderReport.xlsx";
// Определяем объединения для заголовков using (System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog())
{
saveFileDialog.Title = "Сохранить Excel-документ";
saveFileDialog.FileName = "Отчет2.xlsx";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
path = saveFileDialog.FileName;
MessageBox.Show("Excel-документ успешно создан!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
List<(int, int)> merges = new List<(int, int)> List<(int, int)> merges = new List<(int, int)>
{ {
(0,1), (0,1),
(2, 3) (2, 3)
}; };
// Убедитесь, что высоты соответствуют количеству строк
List<int> heights = Enumerable.Repeat(20, 4).ToList(); List<int> heights = Enumerable.Repeat(20, 4).ToList();
// Заголовки шапки
List<(string, string)> headers = new List<(string, string)> List<(string, string)> headers = new List<(string, string)>
{ {
("","Данные"), ("","Данные"),
("Id", "Идентификатор"), ("Id", "Идентификатор"),
("Fullname", "ФИО заказчика"), ("Fullname", "ФИО заказчика"),
//("DestinationCityId","Идентификатор города"),
("", "Заказ"), ("", "Заказ"),
("DestinationCityName", "Город назначения"), ("DestinationCityName", "Город назначения"),
("ExpectedDeliveryDate", "Дата получения заказа") ("ExpectedDeliveryDate", "Дата получения заказа")
}; };
// Проверьте, что все списки заполнены
if (merges.Count == 0 || heights.Count == 0 || headers.Count == 0 || tableData.Count == 0) if (merges.Count == 0 || heights.Count == 0 || headers.Count == 0 || tableData.Count == 0)
{ {
MessageBox.Show("Недостаточно данных для создания отчета.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); MessageBox.Show("Недостаточно данных для создания отчета.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
return; return;
} }
// Вывод отладочной информации
Console.WriteLine($"Merges Count: {merges.Count}"); Console.WriteLine($"Merges Count: {merges.Count}");
Console.WriteLine($"Heights Count: {heights.Count}"); Console.WriteLine($"Heights Count: {heights.Count}");
Console.WriteLine($"Headers Count: {headers.Count}"); Console.WriteLine($"Headers Count: {headers.Count}");
Console.WriteLine($"TableData Count: {tableData.Count}"); Console.WriteLine($"TableData Count: {tableData.Count}");
// Вызов метода для создания Excel файла
if (excelTableComponent1.createWithTable(path, "Отчет по заказам", merges, heights, headers, tableData)) if (excelTableComponent1.createWithTable(path, "Отчет по заказам", merges, heights, headers, tableData))
{ {
MessageBox.Show("Отчет успешно создан!"); MessageBox.Show("Отчет успешно создан!");
@ -257,10 +261,10 @@ namespace Lab3Form
private void CreateDocumentButton_Click(object sender, EventArgs e) private void CreateDocumentButton_Click(object sender, EventArgs e)
{ {
// Извлечение заказов
var orders = _logic.ReadList(null).Cast<OrderViewModel>().ToList(); var orders = _logic.ReadList(null).Cast<OrderViewModel>().ToList();
// Подготовка данных для диаграммы
var chartData = new Dictionary<string, List<(DateTime Date, int Count)>>(); var chartData = new Dictionary<string, List<(DateTime Date, int Count)>>();
foreach (var order in orders) foreach (var order in orders)
@ -270,7 +274,7 @@ namespace Lab3Form
chartData[order.DestinationCityName] = new List<(DateTime Date, int Count)>(); chartData[order.DestinationCityName] = new List<(DateTime Date, int Count)>();
} }
// Добавляем заказ в соответствующий город назначения и дату
var existingData = chartData[order.DestinationCityName] var existingData = chartData[order.DestinationCityName]
.FirstOrDefault(d => d.Date.Date == order.ExpectedDeliveryDate.Date); .FirstOrDefault(d => d.Date.Date == order.ExpectedDeliveryDate.Date);
@ -280,14 +284,27 @@ namespace Lab3Form
} }
else else
{ {
// Увеличиваем счетчик для существующей даты
int index = chartData[order.DestinationCityName].FindIndex(d => d.Date.Date == order.ExpectedDeliveryDate.Date); int index = chartData[order.DestinationCityName].FindIndex(d => d.Date.Date == order.ExpectedDeliveryDate.Date);
var updatedValue = chartData[order.DestinationCityName][index]; var updatedValue = chartData[order.DestinationCityName][index];
chartData[order.DestinationCityName][index] = (updatedValue.Date, updatedValue.Count + 1); chartData[order.DestinationCityName][index] = (updatedValue.Date, updatedValue.Count + 1);
} }
} }
// Создание конфигурации для документа
string filePath = "G://report.docx"; // Укажите нужное имя файла string filePath = "Отчет3.docx";
using (System.Windows.Forms.SaveFileDialog saveFileDialog = new System.Windows.Forms.SaveFileDialog())
{
saveFileDialog.Title = "Сохранить Word-документ";
saveFileDialog.FileName = "Отчет3.docx";
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
filePath = saveFileDialog.FileName;
MessageBox.Show("Docx-документ успешно создан!", "Успех", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
var config = new ComponentDocumentWithChartConfig var config = new ComponentDocumentWithChartConfig
{ {
ChartTitle = "Отчет по заказам", ChartTitle = "Отчет по заказам",
@ -295,15 +312,15 @@ namespace Lab3Form
Data = chartData.ToDictionary( Data = chartData.ToDictionary(
entry => entry.Key, entry => entry.Key,
entry => entry.Value.Select(d => (DateTimeToInt(d.Date), (double)d.Count)).ToList()), entry => entry.Value.Select(d => (DateTimeToInt(d.Date), (double)d.Count)).ToList()),
FilePath = filePath, // Устанавливаем путь к файлу FilePath = filePath,
Header = "Заголовок отчета" // Устанавливаем заголовок Header = "Заголовок отчета"
}; };
// Создание экземпляра вашего связующего класса
var documentComponent = new ComponentDocumentWithChartLineWord(); var documentComponent = new ComponentDocumentWithChartLineWord();
// Создание документа
documentComponent.CreateDoc(config); documentComponent.CreateDoc(config);
MessageBox.Show("Документ создан успешно!"); MessageBox.Show("Документ создан успешно!");

View File

@ -1,5 +1,6 @@
using InternetShopOrdersContracts.BindingModels; using InternetShopOrdersContracts.BindingModels;
using InternetShopOrdersContracts.BusinessLogicContracts; using InternetShopOrdersContracts.BusinessLogicContracts;
using InternetShopOrdersContracts.SearchModels;
using InternetShopOrdersContracts.ViewModels; using InternetShopOrdersContracts.ViewModels;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -15,7 +16,7 @@ namespace Lab3Form
{ {
public partial class FormOrder : Form public partial class FormOrder : Form
{ {
private int? _id; public int? _id;
private readonly IOrderLogic _logic; private readonly IOrderLogic _logic;
private readonly ICityLogic _cityLogic; private readonly ICityLogic _cityLogic;
private List<CityViewModel> _Cities; private List<CityViewModel> _Cities;
@ -24,6 +25,7 @@ namespace Lab3Form
public FormOrder(IOrderLogic logic, ICityLogic cityLogic) public FormOrder(IOrderLogic logic, ICityLogic cityLogic)
{ {
InitializeComponent(); InitializeComponent();
_logic = logic; _logic = logic;
_cityLogic = cityLogic; _cityLogic = cityLogic;
_Cities = new List<CityViewModel>(); _Cities = new List<CityViewModel>();
@ -33,11 +35,54 @@ namespace Lab3Form
var orderStatuses = new List<string> { "Создан", "Подтвержден", "Отправлен", "Доставлен" }; var orderStatuses = new List<string> { "Создан", "Подтвержден", "Отправлен", "Доставлен" };
listBox1.Items.AddRange(orderStatuses.ToArray()); listBox1.Items.AddRange(orderStatuses.ToArray());
DateTime now = DateTime.Now; DateTime now = DateTime.Now;
customInputRangeDate1.MinDate = now.AddYears(-1); customInputRangeDate1.MinDate = now.AddYears(-1);
customInputRangeDate1.MaxDate = now.AddYears(1); customInputRangeDate1.MaxDate = now.AddYears(1);
this.Load += FormOrder_Load;
} }
private void buttonSave_Click(object sender, EventArgs e) private void FormOrder_Load(object sender, EventArgs e)
{
if (_id.HasValue)
{
try
{
OrderSearchModel searchModel = new OrderSearchModel { Id = _id.Value };
OrderViewModel orderViewModel = _logic.ReadElement(searchModel);
if (orderViewModel != null)
{
textBoxFIO.Text = orderViewModel.Fullname;
CityViewModel selectedCity = _Cities.FirstOrDefault(city => city.Id == orderViewModel.DestinationCityId);
if (selectedCity != null)
{
customListBox1.SelectedItem = selectedCity.Name;
}
customInputRangeDate1.Date = orderViewModel.ExpectedDeliveryDate;
foreach (string status in orderViewModel.OrderStatusHistory)
{
int index = listBox1.Items.IndexOf(status);
if (index != -1)
{
listBox1.SetSelected(index, true);
}
}
}
else
{
MessageBox.Show("Заказ с указанным ID не найден.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void buttonSave_Click(object sender, EventArgs e)
{ {
if (string.IsNullOrEmpty(textBoxFIO.Text)) if (string.IsNullOrEmpty(textBoxFIO.Text))
{ {