From b0fbcad227e64c70efc53d2dd56b0b6771d8c73a Mon Sep 17 00:00:00 2001 From: Yourdax Date: Tue, 29 Oct 2024 16:20:42 +0400 Subject: [PATCH] =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D0=B8=D0=BA=D0=B8=20+?= =?UTF-8?q?=20=D1=81=D0=B4=D0=B0=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- KopLab1/Lab3Form/FormMain.cs | 103 ++++++++++++++++++++-------------- KopLab1/Lab3Form/FormOrder.cs | 53 +++++++++++++++-- 2 files changed, 109 insertions(+), 47 deletions(-) diff --git a/KopLab1/Lab3Form/FormMain.cs b/KopLab1/Lab3Form/FormMain.cs index eee3d68..6ef61ae 100644 --- a/KopLab1/Lab3Form/FormMain.cs +++ b/KopLab1/Lab3Form/FormMain.cs @@ -21,6 +21,7 @@ using ComponentsLibraryNet60.Models; using FormLibrary.HelperClasses; using FormLibrary; using ComponentsLibraryNet60.DocumentWithChart; +using Microsoft.Win32; namespace Lab3Form { @@ -81,7 +82,7 @@ namespace Lab3Form var service = Program.ServiceProvider?.GetService(typeof(FormOrder)); if (service is FormOrder form) { - form.Id = controlDataTable.GetSelectedObject().Id ?? 0; + form._id = controlDataTable.GetSelectedObject().Id; if (form.ShowDialog() == DialogResult.OK) { LoadData(); @@ -116,54 +117,53 @@ namespace Lab3Form { try { - // Получаем заказы из логики + var orders = _logic.ReadList(null); - // Создаем список таблиц для PDF + var orderTables = new List(); foreach (var order in orders) { - // Получаем количество строк для таблицы на основе количества статусов + int rowCount = order.OrderStatusHistory.Count; - // Создаем таблицу с числом строк, равным количеству статусов, и четырьмя колонками - // +1 строка для заголовков + string[,] orderTable = new string[rowCount+1, 4]; - // Первая строка — заголовок + orderTable[0, 0] = "Статус"; orderTable[0, 1] = "Идентификатор заказа"; orderTable[0, 2] = "Город назначения"; orderTable[0, 3] = "Дата доставки"; - // Заполняем строки таблицы статусами и данными о заказе + for (int i = 0; i < rowCount; i++) { - orderTable[i+1, 0] = order.OrderStatusHistory[i]; // Статус заказа - orderTable[i+1, 1] = order.Id.ToString(); // Имя заказчика - orderTable[i+1, 2] = order.DestinationCityName; // Город назначения - orderTable[i+1, 3] = order.ExpectedDeliveryDate.ToString("yyyy-MM-dd"); // Дата доставки + orderTable[i+1, 0] = order.OrderStatusHistory[i]; + orderTable[i+1, 1] = order.Id.ToString(); + orderTable[i+1, 2] = order.DestinationCityName; + orderTable[i+1, 3] = order.ExpectedDeliveryDate.ToString("yyyy-MM-dd"); } - // Добавляем таблицу заказа в список + 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.Title = "Сохранить PDF-документ"; - saveFileDialog.FileName = "Отчет1.pdf"; // Имя по умолчанию + saveFileDialog.FileName = "Отчет1.pdf"; if (saveFileDialog.ShowDialog() == DialogResult.OK) { - // Создаем PDF данные с указанным пользователем путем + var pdfData = new PdfDocumentData( - saveFileDialog.FileName, // Используем выбранный путь и имя файла + saveFileDialog.FileName, "Отчет по заказам", - orderTables // Передаем список таблиц в PDF-данные + orderTables ); var documentGenerator = new PDFTable(); @@ -181,7 +181,7 @@ namespace Lab3Form private void buttonCreateOrderReport_Click(object sender, EventArgs e) { - // Получаем список заказов из логики + var orders = _logic.ReadList(null); if (orders == null || orders.Count == 0) { @@ -189,7 +189,7 @@ namespace Lab3Form return; } - // Подготовка данных для Excel + var tableData = new List(); foreach (var order in orders) { @@ -197,53 +197,57 @@ namespace Lab3Form { tableData.Add(new OrderExcelViewModel( order.Id, - order.Fullname, - //order.DestinationCityId, + order.Fullname, order.DestinationCityName, order.ExpectedDeliveryDate )); } } - - - // Определение параметров для Excel 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)> { (0,1), (2, 3) }; - // Убедитесь, что высоты соответствуют количеству строк List heights = Enumerable.Repeat(20, 4).ToList(); - // Заголовки шапки + List<(string, string)> headers = new List<(string, string)> { ("","Данные"), ("Id", "Идентификатор"), ("Fullname", "ФИО заказчика"), - //("DestinationCityId","Идентификатор города"), ("", "Заказ"), ("DestinationCityName", "Город назначения"), ("ExpectedDeliveryDate", "Дата получения заказа") }; - // Проверьте, что все списки заполнены if (merges.Count == 0 || heights.Count == 0 || headers.Count == 0 || tableData.Count == 0) { MessageBox.Show("Недостаточно данных для создания отчета.", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } - // Вывод отладочной информации Console.WriteLine($"Merges Count: {merges.Count}"); Console.WriteLine($"Heights Count: {heights.Count}"); Console.WriteLine($"Headers Count: {headers.Count}"); Console.WriteLine($"TableData Count: {tableData.Count}"); - // Вызов метода для создания Excel файла if (excelTableComponent1.createWithTable(path, "Отчет по заказам", merges, heights, headers, tableData)) { MessageBox.Show("Отчет успешно создан!"); @@ -257,10 +261,10 @@ namespace Lab3Form private void CreateDocumentButton_Click(object sender, EventArgs e) { - // Извлечение заказов + var orders = _logic.ReadList(null).Cast().ToList(); - // Подготовка данных для диаграммы + var chartData = new Dictionary>(); foreach (var order in orders) @@ -270,7 +274,7 @@ namespace Lab3Form chartData[order.DestinationCityName] = new List<(DateTime Date, int Count)>(); } - // Добавляем заказ в соответствующий город назначения и дату + var existingData = chartData[order.DestinationCityName] .FirstOrDefault(d => d.Date.Date == order.ExpectedDeliveryDate.Date); @@ -280,14 +284,27 @@ namespace Lab3Form } else { - // Увеличиваем счетчик для существующей даты + int index = chartData[order.DestinationCityName].FindIndex(d => d.Date.Date == order.ExpectedDeliveryDate.Date); var updatedValue = chartData[order.DestinationCityName][index]; 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 { ChartTitle = "Отчет по заказам", @@ -295,15 +312,15 @@ namespace Lab3Form Data = chartData.ToDictionary( entry => entry.Key, entry => entry.Value.Select(d => (DateTimeToInt(d.Date), (double)d.Count)).ToList()), - FilePath = filePath, // Устанавливаем путь к файлу - Header = "Заголовок отчета" // Устанавливаем заголовок + FilePath = filePath, + Header = "Заголовок отчета" }; - // Создание экземпляра вашего связующего класса + var documentComponent = new ComponentDocumentWithChartLineWord(); - // Создание документа + documentComponent.CreateDoc(config); MessageBox.Show("Документ создан успешно!"); diff --git a/KopLab1/Lab3Form/FormOrder.cs b/KopLab1/Lab3Form/FormOrder.cs index df66dab..8081c48 100644 --- a/KopLab1/Lab3Form/FormOrder.cs +++ b/KopLab1/Lab3Form/FormOrder.cs @@ -1,5 +1,6 @@ using InternetShopOrdersContracts.BindingModels; using InternetShopOrdersContracts.BusinessLogicContracts; +using InternetShopOrdersContracts.SearchModels; using InternetShopOrdersContracts.ViewModels; using System; using System.Collections.Generic; @@ -15,7 +16,7 @@ namespace Lab3Form { public partial class FormOrder : Form { - private int? _id; + public int? _id; private readonly IOrderLogic _logic; private readonly ICityLogic _cityLogic; private List _Cities; @@ -24,6 +25,7 @@ namespace Lab3Form public FormOrder(IOrderLogic logic, ICityLogic cityLogic) { InitializeComponent(); + _logic = logic; _cityLogic = cityLogic; _Cities = new List(); @@ -33,11 +35,54 @@ namespace Lab3Form var orderStatuses = new List { "Создан", "Подтвержден", "Отправлен", "Доставлен" }; listBox1.Items.AddRange(orderStatuses.ToArray()); DateTime now = DateTime.Now; - customInputRangeDate1.MinDate = now.AddYears(-1); - customInputRangeDate1.MaxDate = now.AddYears(1); + customInputRangeDate1.MinDate = 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)) {