using BusinessLogics.BusinessLogics; using Components.NonVisualComponents; using ComponentsLibrary.NonVisualComponents.HelperModels; using ComponentsLibrary.NonVisualComponents; using ComponentsLibrary.VisualComponents; using ComponentsLibraryNet60.DocumentWithTable; using ComponentsLibraryNet60.Models; using Contracts.BindingModels; using Contracts.BusinessLogicsContracts; using Contracts.ViewModels; using DatabaseImplement.Implements; using Microsoft.Extensions.Logging; using Plugins; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NLog.Extensions.Logging; namespace WinForms { /// /// Реализация интерфейса-соглашения для плагинов /// public class PluginsConvention : IPluginsConvention { /// /// Название плагина /// public string PluginName => "Orders"; /// /// Визуальный компонент для вывода списка в виде дерева /// private readonly UserTreeView _userTreeView; /// /// Бизнес-логика для сущности "Счет" /// private readonly IOrderLogic _orderLogic; /// /// Бизнес-логика для сущности "Тип заказа" /// private readonly IOrderTypeLogic _orderTypeLogic; /// /// Конструктор /// public PluginsConvention() { _userTreeView = new UserTreeView(); var hierarchy = new List() { "Type", "Sum", "Id", "WaiterFullName" }; _userTreeView.SetHierarchy(hierarchy); var loggerFactory = LoggerFactory.Create(builder => builder.AddNLog()); var orderLogicLogger = loggerFactory.CreateLogger(); var orderTypeLogicLogger = loggerFactory.CreateLogger(); _orderLogic = new OrderLogic(orderLogicLogger, new OrderStorage()); _orderTypeLogic = new OrderTypeLogic(orderTypeLogicLogger, new OrderTypeStorage()); } /// /// Получение контрола для вывода набора данных /// public UserControl GetControl { get { ReloadData(); return _userTreeView; } } /// /// Получение элемента, выбранного в контроле /// public PluginsConventionElement GetElement { get { var order = _userTreeView.GetSelectedObject(); int id = -1; if (order != null) { id = order.Id; } byte[] bytes = new byte[16]; BitConverter.GetBytes(id).CopyTo(bytes, 0); return new PluginsConventionElement { Id = new Guid(bytes) }; } } /// /// Получение формы для создания/редактирования объекта /// /// /// public Form GetForm(PluginsConventionElement element) { if (element == null) { return new FormOrder(_orderLogic, _orderTypeLogic); } if (element.Id.GetHashCode() >= 0) { byte[] bytes = element.Id.ToByteArray(); int Id = BitConverter.ToInt32(bytes, 0); var form = new FormOrder(_orderLogic, _orderTypeLogic); form.Id = Id; return form; } return null; } /// /// Получение формы для работы со справочником /// /// public Form GetThesaurus() { return new FormOrderTypes(_orderTypeLogic); } /// /// Удаление элемента /// /// /// public bool DeleteElement(PluginsConventionElement element) { if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) != DialogResult.Yes) { return false; } byte[] bytes = element.Id.ToByteArray(); int Id = BitConverter.ToInt32(bytes, 0); try { _orderLogic.Delete(new OrderBindingModel() { Id = Id }); ReloadData(); return true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } /// /// Обновление набора данных в контроле /// public void ReloadData() { try { var orders = _orderLogic.ReadList(null); if (orders == null) { return; } foreach (var order in orders) { if (string.IsNullOrEmpty(order.Sum)) { order.Sum = "По акции"; } _userTreeView.AddObjectToTree(order); } } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } /// /// Создание простого документа /// /// /// public bool CreateSimpleDocument(PluginsConventionSaveDocument saveDocument) { try { var orders = _orderLogic.ReadList(null); if (orders == null) { return false; } string title = "Информация по аукционным счетам."; List rows = new List(); foreach (var order in orders) { if (string.IsNullOrEmpty(order.Sum)) { string row = $"ФИО официанта: {order.WaiterFullName} -- Описание счета: {order.Info}"; rows.Add(row); } } string[] rowsArray = rows.ToArray(); var bigTextComponent = new BigTextComponent(); bigTextComponent.CreateDocument(saveDocument.FileName, title, rowsArray); return true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } /// /// Создание документа с настраиваемой таблицей /// /// /// public bool CreateTableDocument(PluginsConventionSaveDocument saveDocument) { try { var orders = _orderLogic.ReadList(null); if (orders == null) { return false; } foreach (var order in orders) { if (string.IsNullOrEmpty(order.Sum)) { order.Sum = "По акции"; } } var componentDocumentWithTableMultiHeaderWord = new ComponentDocumentWithTableMultiHeaderWord(); componentDocumentWithTableMultiHeaderWord.CreateDoc(new ComponentDocumentWithTableHeaderDataConfig { FilePath = saveDocument.FileName, Header = "Информация по счетам.", ColumnsRowsWidth = new List<(int Column, int Row)>() { (5, 5), (10, 5), (15, 0), (15, 0), }, Headers = new List<(int ColumnIndex, int RowIndex, string Header, string PropertyName)>() { (0, 0, "Id", "Id"), (1, 0, "ФИО официанта", "WaiterFullName"), (2, 0, "Тип заказа", "Type"), (3, 0, "Сумма заказа", "Sum") }, Data = orders, }); return true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } /// /// Создание документа с диаграммой /// /// /// public bool CreateChartDocument(PluginsConventionSaveDocument saveDocument) { try { var orders = _orderLogic.ReadList(null); if (orders == null) { return false; } var orderTypes = _orderTypeLogic.ReadList(null); if (orderTypes == null) { return false; } List<(double, string)> items = new List<(double, string)>(); foreach (var orderType in orderTypes) { int count = 0; foreach (var order in orders) { if (order.Type == orderType.Name && string.IsNullOrEmpty(order.Sum)) { count++; } } items.Add((count, orderType.Name)); } var pdfPieChart = new PdfPieChart(); pdfPieChart.CreatePieChart(new DataForPieChart(saveDocument.FileName, "Информация по оплаченным счетам каждого типа заказов", "Круговая диаграмма", DiagramLegendEnum.Top, "Типы заказов", items)); return true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } } } }