From 0c5d62f563f33666c343e21558adb84fe6da7908 Mon Sep 17 00:00:00 2001 From: ekallin Date: Sun, 25 Feb 2024 19:52:48 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D0=B2=D1=81=D0=B5=20=D0=BE=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=B2=D1=88=D0=B8=D0=B5=D1=81=D1=8F=20=D0=B1=D0=B8=D0=B1=D0=BB?= =?UTF-8?q?=D0=B8=D0=BE=D1=82=D0=B5=D0=BA=D0=B8,=20=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D1=81=D1=81=D1=8B,=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B.=20=D0=92?= =?UTF-8?q?=D1=81=D0=B5=20=D1=80=D0=B0=D1=81=D0=BF=D1=80=D0=B5=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=BE=20=D0=BF=D0=BE=20=D0=BF=D0=B0=D0=BF?= =?UTF-8?q?=D0=BA=D0=B0=D0=BC,=20=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=BE=20?= =?UTF-8?q?=D0=BA=20=D1=81=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8=D1=8E=20PR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- SushiBar/Components/FormComponent.Designer.cs | 128 +++++++++ SushiBar/Components/FormComponent.cs | 91 +++++++ SushiBar/Components/FormComponent.resx | 120 +++++++++ .../Components/FormComponents.Designer.cs | 123 +++++++++ SushiBar/Components/FormComponents.cs | 124 +++++++++ SushiBar/Components/FormComponents.resx | 120 +++++++++ SushiBar/FormMain.Designer.cs | 174 ++++++++++++ SushiBar/FormMain.cs | 154 +++++++++++ SushiBar/FormMain.resx | 126 +++++++++ SushiBar/Orders/FormCreateOrder.Designer.cs | 151 +++++++++++ SushiBar/Orders/FormCreateOrder.cs | 118 +++++++++ SushiBar/Orders/FormCreateOrder.resx | 120 +++++++++ SushiBar/Program.cs | 43 ++- SushiBar/SushiBar.sln | 2 +- .../{SushiBar.csproj => SushiBarView.csproj} | 6 + SushiBar/Sushis/FormSushi.Designer.cs | 247 ++++++++++++++++++ SushiBar/Sushis/FormSushi.cs | 204 +++++++++++++++ SushiBar/Sushis/FormSushi.resx | 129 +++++++++ .../Sushis/FormSushiComponent.Designer.cs | 137 ++++++++++ SushiBar/Sushis/FormSushiComponent.cs | 80 ++++++ SushiBar/Sushis/FormSushiComponent.resx | 120 +++++++++ SushiBar/Sushis/FormSushis.Designer.cs | 123 +++++++++ SushiBar/Sushis/FormSushis.cs | 122 +++++++++ SushiBar/Sushis/FormSushis.resx | 120 +++++++++ SushiBar/nlog.config | 16 ++ SushiBarListImplements/DataListSingleton.cs | 4 +- .../ComponentStorage.cs | 3 +- .../{Orders => Implements}/OrderStorage.cs | 3 +- .../{Sushis => Implements}/SushiStorage.cs | 3 +- .../{Components => Models}/Component.cs | 2 +- .../{Orders => Models}/Order.cs | 2 +- .../{Sushis => Models}/Sushi.cs | 2 +- 32 files changed, 2905 insertions(+), 12 deletions(-) create mode 100644 SushiBar/Components/FormComponent.Designer.cs create mode 100644 SushiBar/Components/FormComponent.cs create mode 100644 SushiBar/Components/FormComponent.resx create mode 100644 SushiBar/Components/FormComponents.Designer.cs create mode 100644 SushiBar/Components/FormComponents.cs create mode 100644 SushiBar/Components/FormComponents.resx create mode 100644 SushiBar/FormMain.Designer.cs create mode 100644 SushiBar/FormMain.cs create mode 100644 SushiBar/FormMain.resx create mode 100644 SushiBar/Orders/FormCreateOrder.Designer.cs create mode 100644 SushiBar/Orders/FormCreateOrder.cs create mode 100644 SushiBar/Orders/FormCreateOrder.resx rename SushiBar/{SushiBar.csproj => SushiBarView.csproj} (71%) create mode 100644 SushiBar/Sushis/FormSushi.Designer.cs create mode 100644 SushiBar/Sushis/FormSushi.cs create mode 100644 SushiBar/Sushis/FormSushi.resx create mode 100644 SushiBar/Sushis/FormSushiComponent.Designer.cs create mode 100644 SushiBar/Sushis/FormSushiComponent.cs create mode 100644 SushiBar/Sushis/FormSushiComponent.resx create mode 100644 SushiBar/Sushis/FormSushis.Designer.cs create mode 100644 SushiBar/Sushis/FormSushis.cs create mode 100644 SushiBar/Sushis/FormSushis.resx create mode 100644 SushiBar/nlog.config rename SushiBarListImplements/{Components => Implements}/ComponentStorage.cs (97%) rename SushiBarListImplements/{Orders => Implements}/OrderStorage.cs (97%) rename SushiBarListImplements/{Sushis => Implements}/SushiStorage.cs (97%) rename SushiBarListImplements/{Components => Models}/Component.cs (96%) rename SushiBarListImplements/{Orders => Models}/Order.cs (97%) rename SushiBarListImplements/{Sushis => Models}/Sushi.cs (97%) diff --git a/SushiBar/Components/FormComponent.Designer.cs b/SushiBar/Components/FormComponent.Designer.cs new file mode 100644 index 0000000..cbf4f9c --- /dev/null +++ b/SushiBar/Components/FormComponent.Designer.cs @@ -0,0 +1,128 @@ +namespace SushiBarView +{ + partial class FormComponent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelComponentName = new Label(); + labelCost = new Label(); + textBoxComponentName = new TextBox(); + textBoxComponentCost = new TextBox(); + buttonSaveComponent = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // labelComponentName + // + labelComponentName.AutoSize = true; + labelComponentName.Font = new Font("Candara", 12F); + labelComponentName.Location = new Point(20, 29); + labelComponentName.Margin = new Padding(4, 0, 4, 0); + labelComponentName.Name = "labelComponentName"; + labelComponentName.Size = new Size(93, 24); + labelComponentName.TabIndex = 0; + labelComponentName.Text = "Название"; + // + // labelCost + // + labelCost.AutoSize = true; + labelCost.Font = new Font("Candara", 12F); + labelCost.Location = new Point(29, 111); + labelCost.Margin = new Padding(4, 0, 4, 0); + labelCost.Name = "labelCost"; + labelCost.Size = new Size(53, 24); + labelCost.TabIndex = 1; + labelCost.Text = "Цена"; + // + // textBoxComponentName + // + textBoxComponentName.Anchor = AnchorStyles.Top | AnchorStyles.Right; + textBoxComponentName.Location = new Point(134, 21); + textBoxComponentName.Name = "textBoxComponentName"; + textBoxComponentName.Size = new Size(355, 32); + textBoxComponentName.TabIndex = 2; + // + // textBoxComponentCost + // + textBoxComponentCost.Anchor = AnchorStyles.Top | AnchorStyles.Right; + textBoxComponentCost.Location = new Point(134, 103); + textBoxComponentCost.Name = "textBoxComponentCost"; + textBoxComponentCost.Size = new Size(355, 32); + textBoxComponentCost.TabIndex = 3; + // + // buttonSaveComponent + // + buttonSaveComponent.Anchor = AnchorStyles.Bottom; + buttonSaveComponent.Location = new Point(134, 161); + buttonSaveComponent.Name = "buttonSaveComponent"; + buttonSaveComponent.Size = new Size(116, 39); + buttonSaveComponent.TabIndex = 4; + buttonSaveComponent.Text = "Сохранить"; + buttonSaveComponent.UseVisualStyleBackColor = true; + buttonSaveComponent.Click += buttonSaveComponent_Click; + // + // buttonCancel + // + buttonCancel.Anchor = AnchorStyles.Bottom; + buttonCancel.Location = new Point(373, 161); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(116, 39); + buttonCancel.TabIndex = 5; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // FormComponent + // + AutoScaleDimensions = new SizeF(11F, 24F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(515, 230); + Controls.Add(buttonCancel); + Controls.Add(buttonSaveComponent); + Controls.Add(textBoxComponentCost); + Controls.Add(textBoxComponentName); + Controls.Add(labelCost); + Controls.Add(labelComponentName); + Font = new Font("Candara", 12F, FontStyle.Regular, GraphicsUnit.Point, 204); + Margin = new Padding(4); + Name = "FormComponent"; + Text = "Компонент"; + Load += FormComponents_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelComponentName; + private Label labelCost; + private TextBox textBoxComponentName; + private TextBox textBoxComponentCost; + private Button buttonSaveComponent; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/SushiBar/Components/FormComponent.cs b/SushiBar/Components/FormComponent.cs new file mode 100644 index 0000000..66f5df9 --- /dev/null +++ b/SushiBar/Components/FormComponent.cs @@ -0,0 +1,91 @@ + +using Microsoft.Extensions.Logging; +using SushiBarContracts.BindingModel; +using SushiBarContracts.BusinessLogicsContracts; +using SushiBarContracts.SearchModel; +using System.Windows.Forms; + +namespace SushiBarView +{ + public partial class FormComponent : Form + { + private readonly ILogger _logger; + private readonly IComponentLogic _logic; + private int? _id; + public int Id + { + set { _id = value; } + } + public FormComponent(ILogger logger, IComponentLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void FormComponents_Load(object sender, EventArgs e) + { + if (_id.HasValue) + { + try + { + _logger.LogInformation("Получение компонента"); + var view = _logic.ReadElement(new ComponentSearchModel + { + Id = _id.Value + }); + if (view != null) + { + textBoxComponentName.Text = view.ComponentName; + textBoxComponentCost.Text = view.Cost.ToString(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения компонента"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + + private void buttonSaveComponent_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxComponentName.Text)) + { + MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Сохранение компонента"); + try + { + var model = new ComponentBindingModel + { + Id = _id ?? 0, + ComponentName = textBoxComponentName.Text, + Cost = Convert.ToDouble(textBoxComponentCost.Text) + }; + var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", + MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения компонента"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/SushiBar/Components/FormComponent.resx b/SushiBar/Components/FormComponent.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SushiBar/Components/FormComponent.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SushiBar/Components/FormComponents.Designer.cs b/SushiBar/Components/FormComponents.Designer.cs new file mode 100644 index 0000000..5db3d6c --- /dev/null +++ b/SushiBar/Components/FormComponents.Designer.cs @@ -0,0 +1,123 @@ +namespace SushiBarView +{ + partial class FormComponents + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + dataGridView = new DataGridView(); + buttonAddComponent = new Button(); + buttonUpdateComponent = new Button(); + buttonRemoveComponent = new Button(); + buttonRefreshComponents = new Button(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // dataGridView + // + dataGridView.BackgroundColor = SystemColors.ActiveCaption; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Left; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(569, 521); + dataGridView.TabIndex = 0; + // + // buttonAddComponent + // + buttonAddComponent.Font = new Font("Candara", 12F); + buttonAddComponent.Location = new Point(637, 35); + buttonAddComponent.Name = "buttonAddComponent"; + buttonAddComponent.Size = new Size(121, 46); + buttonAddComponent.TabIndex = 1; + buttonAddComponent.Text = "Добавить"; + buttonAddComponent.UseVisualStyleBackColor = true; + buttonAddComponent.Click += buttonAddComponent_Click; + // + // buttonUpdateComponent + // + buttonUpdateComponent.Font = new Font("Candara", 12F); + buttonUpdateComponent.Location = new Point(637, 167); + buttonUpdateComponent.Name = "buttonUpdateComponent"; + buttonUpdateComponent.Size = new Size(121, 46); + buttonUpdateComponent.TabIndex = 2; + buttonUpdateComponent.Text = "Изменить"; + buttonUpdateComponent.UseVisualStyleBackColor = true; + buttonUpdateComponent.Click += buttonUpdateComponent_Click; + // + // buttonRemoveComponent + // + buttonRemoveComponent.Font = new Font("Candara", 12F); + buttonRemoveComponent.Location = new Point(637, 307); + buttonRemoveComponent.Name = "buttonRemoveComponent"; + buttonRemoveComponent.Size = new Size(121, 46); + buttonRemoveComponent.TabIndex = 3; + buttonRemoveComponent.Text = "Удалить"; + buttonRemoveComponent.UseVisualStyleBackColor = true; + buttonRemoveComponent.Click += buttonRemoveComponent_Click; + // + // buttonRefreshComponents + // + buttonRefreshComponents.Font = new Font("Candara", 12F); + buttonRefreshComponents.Location = new Point(637, 444); + buttonRefreshComponents.Name = "buttonRefreshComponents"; + buttonRefreshComponents.Size = new Size(121, 46); + buttonRefreshComponents.TabIndex = 4; + buttonRefreshComponents.Text = "Обновить"; + buttonRefreshComponents.UseVisualStyleBackColor = true; + buttonRefreshComponents.Click += buttonRefreshComponents_Click; + // + // FormComponents + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(800, 521); + Controls.Add(buttonRefreshComponents); + Controls.Add(buttonRemoveComponent); + Controls.Add(buttonUpdateComponent); + Controls.Add(buttonAddComponent); + Controls.Add(dataGridView); + Name = "FormComponents"; + Text = "Компоненты"; + Load += FormComponents_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private DataGridView dataGridView; + private Button buttonAddComponent; + private Button buttonUpdateComponent; + private Button buttonRemoveComponent; + private Button buttonRefreshComponents; + } +} \ No newline at end of file diff --git a/SushiBar/Components/FormComponents.cs b/SushiBar/Components/FormComponents.cs new file mode 100644 index 0000000..5c496d9 --- /dev/null +++ b/SushiBar/Components/FormComponents.cs @@ -0,0 +1,124 @@ +using Microsoft.Extensions.Logging; +using SushiBar; +using SushiBarContracts.BindingModel; +using SushiBarContracts.BusinessLogicsContracts; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SushiBarView +{ + public partial class FormComponents : Form + { + private readonly ILogger _logger; + private readonly IComponentLogic _logic; + private int? _id; + public int Id + { + set { _id = value; } + } + public FormComponents(ILogger logger, IComponentLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void FormComponents_Load(object sender, EventArgs e) + { + LoadData(); + } + private void LoadData() + { + try + { + var list = _logic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["ComponentName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Загрузка компонентов"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки компонентов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonAddComponent_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormComponent)); + if (service is FormComponent form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void buttonUpdateComponent_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = + Program.ServiceProvider?.GetService(typeof(FormComponent)); + if (service is FormComponent form) + { + form.Id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void buttonRemoveComponent_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Удаление компонента"); + try + { + if (!_logic.Delete(new ComponentBindingModel + { + Id = id + })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления компонента"); + MessageBox.Show(ex.Message, "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void buttonRefreshComponents_Click(object sender, EventArgs e) + { + LoadData(); + } + + } +} diff --git a/SushiBar/Components/FormComponents.resx b/SushiBar/Components/FormComponents.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SushiBar/Components/FormComponents.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SushiBar/FormMain.Designer.cs b/SushiBar/FormMain.Designer.cs new file mode 100644 index 0000000..f46a473 --- /dev/null +++ b/SushiBar/FormMain.Designer.cs @@ -0,0 +1,174 @@ +namespace SushiBarView +{ + partial class FormMain + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + menuStrip1 = new MenuStrip(); + ToolStripMenuItemRef = new ToolStripMenuItem(); + компонентыToolStripMenuItem = new ToolStripMenuItem(); + сушиToolStripMenuItem = new ToolStripMenuItem(); + dataGridView = new DataGridView(); + buttonCreateOrder = new Button(); + buttonTakeOrderInWork = new Button(); + buttonOrderReady = new Button(); + buttonOrderIssued = new Button(); + buttonRefreshOrders = new Button(); + menuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // menuStrip1 + // + menuStrip1.ImageScalingSize = new Size(20, 20); + menuStrip1.Items.AddRange(new ToolStripItem[] { ToolStripMenuItemRef }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Size = new Size(1140, 28); + menuStrip1.TabIndex = 0; + menuStrip1.Text = "menuStrip1"; + // + // ToolStripMenuItemRef + // + ToolStripMenuItemRef.DropDownItems.AddRange(new ToolStripItem[] { компонентыToolStripMenuItem, сушиToolStripMenuItem }); + ToolStripMenuItemRef.Name = "ToolStripMenuItemRef"; + ToolStripMenuItemRef.Size = new Size(117, 24); + ToolStripMenuItemRef.Text = "Справочники"; + // + // компонентыToolStripMenuItem + // + компонентыToolStripMenuItem.Name = "компонентыToolStripMenuItem"; + компонентыToolStripMenuItem.Size = new Size(182, 26); + компонентыToolStripMenuItem.Text = "Компоненты"; + компонентыToolStripMenuItem.Click += компонентыToolStripMenuItem_Click; + // + // сушиToolStripMenuItem + // + сушиToolStripMenuItem.Name = "сушиToolStripMenuItem"; + сушиToolStripMenuItem.Size = new Size(182, 26); + сушиToolStripMenuItem.Text = "Суши"; + сушиToolStripMenuItem.Click += сушиToolStripMenuItem_Click; + // + // dataGridView + // + dataGridView.BackgroundColor = Color.White; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(0, 27); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(849, 512); + dataGridView.TabIndex = 1; + // + // buttonCreateOrder + // + buttonCreateOrder.Location = new Point(923, 63); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(171, 52); + buttonCreateOrder.TabIndex = 2; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += buttonCreateOrder_Click; + // + // buttonTakeOrderInWork + // + buttonTakeOrderInWork.Location = new Point(923, 161); + buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; + buttonTakeOrderInWork.Size = new Size(171, 52); + buttonTakeOrderInWork.TabIndex = 3; + buttonTakeOrderInWork.Text = "Отдать на выполнение"; + buttonTakeOrderInWork.UseVisualStyleBackColor = true; + buttonTakeOrderInWork.Click += buttonTakeOrderInWork_Click_1; + // + // buttonOrderReady + // + buttonOrderReady.Location = new Point(923, 253); + buttonOrderReady.Name = "buttonOrderReady"; + buttonOrderReady.Size = new Size(171, 52); + buttonOrderReady.TabIndex = 4; + buttonOrderReady.Text = "Заказ готов"; + buttonOrderReady.UseVisualStyleBackColor = true; + buttonOrderReady.Click += buttonOrderReady_Click_1; + // + // buttonOrderIssued + // + buttonOrderIssued.Location = new Point(923, 351); + buttonOrderIssued.Name = "buttonOrderIssued"; + buttonOrderIssued.Size = new Size(171, 52); + buttonOrderIssued.TabIndex = 5; + buttonOrderIssued.Text = "Заказ выдан"; + buttonOrderIssued.UseVisualStyleBackColor = true; + buttonOrderIssued.Click += buttonOrderIssued_Click; + // + // buttonRefreshOrders + // + buttonRefreshOrders.Location = new Point(923, 450); + buttonRefreshOrders.Name = "buttonRefreshOrders"; + buttonRefreshOrders.Size = new Size(171, 52); + buttonRefreshOrders.TabIndex = 6; + buttonRefreshOrders.Text = "Обновить заказы"; + buttonRefreshOrders.UseVisualStyleBackColor = true; + // + // FormMain + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.FromArgb(210, 255, 210); + ClientSize = new Size(1140, 540); + Controls.Add(buttonRefreshOrders); + Controls.Add(buttonOrderIssued); + Controls.Add(buttonOrderReady); + Controls.Add(buttonTakeOrderInWork); + Controls.Add(buttonCreateOrder); + Controls.Add(dataGridView); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Name = "FormMain"; + Text = "Суши Бар"; + Load += FormMain_Load; + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private MenuStrip menuStrip1; + private ToolStripMenuItem ToolStripMenuItemRef; + private DataGridView dataGridView; + private Button buttonCreateOrder; + private Button buttonTakeOrderInWork; + private Button buttonOrderReady; + private Button buttonOrderIssued; + private Button buttonRefreshOrders; + private ToolStripMenuItem компонентыToolStripMenuItem; + private ToolStripMenuItem сушиToolStripMenuItem; + } +} \ No newline at end of file diff --git a/SushiBar/FormMain.cs b/SushiBar/FormMain.cs new file mode 100644 index 0000000..f7d20cc --- /dev/null +++ b/SushiBar/FormMain.cs @@ -0,0 +1,154 @@ +using Microsoft.Extensions.Logging; +using SushiBar; +using SushiBarContracts.BindingModel; +using SushiBarContracts.BusinessLogicsContracts; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SushiBarView +{ + public partial class FormMain : Form + { + private readonly ILogger _logger; + private readonly IOrderLogic _orderLogic; + public FormMain(ILogger logger, IOrderLogic orderLogic) + { + InitializeComponent(); + _logger = logger; + _orderLogic = orderLogic; + } + private void FormMain_Load(object sender, EventArgs e) + { + LoadData(); + } + private void LoadData() + { + try + { + var list = _orderLogic.ReadList(null); + + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["SushiId"].Visible = false; + dataGridView.Columns["SushiName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Загрузка заказов"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Произошла ошибка при загрузке заказов"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void компонентыToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormComponents)); + if (service is FormComponents form) + { + form.ShowDialog(); + } + } + + private void сушиToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormSushis)); + if(service is FormSushis formSushis) { formSushis.ShowDialog(); } + } + + private void buttonCreateOrder_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormCreateOrder)); + if (service is FormCreateOrder form) + { + form.ShowDialog(); + LoadData(); + } + } + + private void buttonTakeOrderInWork_Click_1(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ ${id}. Меняется статус на 'В работе'", id); + try + { + var operationResult = _orderLogic.TakeOrderInWork(new OrderBindingModel { Id = id }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка передачи заказа в работу"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void buttonOrderReady_Click_1(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ ${id}. Меняется статус на 'Готов'", id); + try + { + var operationResult = _orderLogic.FinishOrder(new OrderBindingModel { Id = id }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void buttonOrderIssued_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Заказ №{id}. Меняется статус на 'Выдан'", id); + try + { + var operationResult = _orderLogic.DeliveryOrder(new OrderBindingModel { Id = id }); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + _logger.LogInformation("Заказ ${id} выдан", id); + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о выдачи заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void ButtonRef_Click(object sender, EventArgs e) + { + LoadData(); + } + + + } +} diff --git a/SushiBar/FormMain.resx b/SushiBar/FormMain.resx new file mode 100644 index 0000000..a39c409 --- /dev/null +++ b/SushiBar/FormMain.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 17, 17 + + + 25 + + \ No newline at end of file diff --git a/SushiBar/Orders/FormCreateOrder.Designer.cs b/SushiBar/Orders/FormCreateOrder.Designer.cs new file mode 100644 index 0000000..6cd491f --- /dev/null +++ b/SushiBar/Orders/FormCreateOrder.Designer.cs @@ -0,0 +1,151 @@ +namespace SushiBarView +{ + partial class FormCreateOrder + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelSushi = new Label(); + labelCount = new Label(); + labelSum = new Label(); + textBoxCount = new TextBox(); + textBoxSum = new TextBox(); + comboBoxSushi = new ComboBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + SuspendLayout(); + // + // labelSushi + // + labelSushi.AutoSize = true; + labelSushi.Location = new Point(30, 30); + labelSushi.Margin = new Padding(4, 0, 4, 0); + labelSushi.Name = "labelSushi"; + labelSushi.Size = new Size(85, 24); + labelSushi.TabIndex = 0; + labelSushi.Text = "Изделие"; + // + // labelCount + // + labelCount.AutoSize = true; + labelCount.Location = new Point(30, 102); + labelCount.Margin = new Padding(4, 0, 4, 0); + labelCount.Name = "labelCount"; + labelCount.Size = new Size(112, 24); + labelCount.TabIndex = 1; + labelCount.Text = "Количество"; + // + // labelSum + // + labelSum.AutoSize = true; + labelSum.Location = new Point(30, 174); + labelSum.Margin = new Padding(4, 0, 4, 0); + labelSum.Name = "labelSum"; + labelSum.Size = new Size(68, 24); + labelSum.TabIndex = 2; + labelSum.Text = "Сумма"; + // + // textBoxCount + // + textBoxCount.Location = new Point(227, 94); + textBoxCount.Name = "textBoxCount"; + textBoxCount.Size = new Size(326, 32); + textBoxCount.TabIndex = 3; + textBoxCount.TextChanged += textBoxCount_TextChanged; + // + // textBoxSum + // + textBoxSum.Enabled = false; + textBoxSum.Location = new Point(227, 166); + textBoxSum.Name = "textBoxSum"; + textBoxSum.Size = new Size(326, 32); + textBoxSum.TabIndex = 4; + // + // comboBoxSushi + // + comboBoxSushi.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxSushi.FormattingEnabled = true; + comboBoxSushi.Location = new Point(227, 22); + comboBoxSushi.Name = "comboBoxSushi"; + comboBoxSushi.Size = new Size(326, 32); + comboBoxSushi.TabIndex = 5; + comboBoxSushi.SelectedIndexChanged += comboBoxSushi_SelectedIndexChanged; + // + // buttonSave + // + buttonSave.Location = new Point(227, 231); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(140, 49); + buttonSave.TabIndex = 6; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += buttonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(413, 231); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(140, 49); + buttonCancel.TabIndex = 7; + buttonCancel.Text = "Отменить"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += buttonCancel_Click; + // + // FormCreateOrder + // + AutoScaleDimensions = new SizeF(11F, 24F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.FromArgb(192, 192, 255); + ClientSize = new Size(595, 302); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(comboBoxSushi); + Controls.Add(textBoxSum); + Controls.Add(textBoxCount); + Controls.Add(labelSum); + Controls.Add(labelCount); + Controls.Add(labelSushi); + Font = new Font("Candara", 12F, FontStyle.Regular, GraphicsUnit.Point, 204); + Margin = new Padding(4); + Name = "FormCreateOrder"; + Text = "Создание заказа"; + Load += FormCreateOrder_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelSushi; + private Label labelCount; + private Label labelSum; + private TextBox textBoxCount; + private TextBox textBoxSum; + private ComboBox comboBoxSushi; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/SushiBar/Orders/FormCreateOrder.cs b/SushiBar/Orders/FormCreateOrder.cs new file mode 100644 index 0000000..7e6b04f --- /dev/null +++ b/SushiBar/Orders/FormCreateOrder.cs @@ -0,0 +1,118 @@ +using Microsoft.Extensions.Logging; +using SushiBarContracts.BindingModel; +using SushiBarContracts.BusinessLogicsContracts; +using SushiBarContracts.SearchModel; + +namespace SushiBarView +{ + public partial class FormCreateOrder : Form + { + private readonly ILogger _logger; + private readonly ISushiLogic _logicSushi; + private readonly IOrderLogic _logicO; + public FormCreateOrder(ILogger logger, ISushiLogic logicSushi, IOrderLogic logicO) + { + InitializeComponent(); + _logger = logger; + _logicSushi = logicSushi; + _logicO = logicO; + } + + private void FormCreateOrder_Load(object sender, EventArgs e) + { + _logger.LogInformation("Загрузка изделий для заказа"); + + try + { + var list = _logicSushi.ReadList(null); + if (list != null) + { + comboBoxSushi.DisplayMember = "SushiName"; + comboBoxSushi.ValueMember = "Id"; + comboBoxSushi.DataSource = list; + comboBoxSushi.SelectedItem = null; + _logger.LogInformation("Загрузка изделий для заказа"); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки списка изделий"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + // прописать логику + } + + private void comboBoxSushi_SelectedIndexChanged(object sender, EventArgs e) + { + CalcSum(); + } + + private void textBoxCount_TextChanged(object sender, EventArgs e) + { + CalcSum(); + } + + private void buttonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxCount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (comboBoxSushi.SelectedValue == null) + { + MessageBox.Show("Выберите изделие", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Создание заказа"); + try + { + var operationResult = _logicO.CreateOrder(new OrderBindingModel + { + SushiId = Convert.ToInt32(comboBoxSushi.SelectedValue), + Count = Convert.ToInt32(textBoxCount.Text), + Sum = Convert.ToDouble(textBoxSum.Text) + }); + if (!operationResult) + { + throw new Exception("Ошибка при создании заказа. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка создания заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + + private void CalcSum() + { + if (comboBoxSushi.SelectedValue != null && !string.IsNullOrEmpty(textBoxCount.Text)) + { + try + { + int id = Convert.ToInt32(comboBoxSushi.SelectedValue); + var product = _logicSushi.ReadElement(new SushiSearchModel { Id = id }); + int count = Convert.ToInt32(textBoxCount.Text); + textBoxSum.Text = Math.Round(count * (product?.Price ?? 0), 2).ToString(); + _logger.LogInformation("Расчет суммы заказа"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка расчета суммы заказа"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + } + } +} diff --git a/SushiBar/Orders/FormCreateOrder.resx b/SushiBar/Orders/FormCreateOrder.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SushiBar/Orders/FormCreateOrder.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SushiBar/Program.cs b/SushiBar/Program.cs index d8d5733..6afbfbd 100644 --- a/SushiBar/Program.cs +++ b/SushiBar/Program.cs @@ -1,17 +1,56 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using NLog.Extensions.Logging; +using SushiBarBusinessLogic.BusinessLogic; +using SushiBarContracts.BusinessLogicsContracts; +using SushiBarContracts.StoragesContracts; +using SushiBarListImplements.Implements; +using SushiBarView; + namespace SushiBar { internal static class Program { + + private static ServiceProvider? _serviceProvider; + public static ServiceProvider? ServiceProvider => _serviceProvider; + /// /// The main entry point for the application. - /// 1 /// [STAThread] static void Main() { // To customize application configuration such as set high DPI settings or default font, // see https://aka.ms/applicationconfiguration. - //ApplicationConfiguration.Initialize(); + ApplicationConfiguration.Initialize(); + var services = new ServiceCollection(); + ConfigureServices(services); + _serviceProvider = services.BuildServiceProvider(); + Application.Run(_serviceProvider.GetRequiredService()); + //Application.Run(new Form1()); + } + + private static void ConfigureServices(ServiceCollection services) + { + services.AddLogging(option => + { + option.SetMinimumLevel(LogLevel.Information); + option.AddNLog("nlog.config"); + }); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/SushiBar/SushiBar.sln b/SushiBar/SushiBar.sln index 443b087..127dfcc 100644 --- a/SushiBar/SushiBar.sln +++ b/SushiBar/SushiBar.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.8.34525.116 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBar", "SushiBar.csproj", "{E1025CC0-5650-4509-93C8-BF4FA2D506E0}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBarView", "SushiBarView.csproj", "{E1025CC0-5650-4509-93C8-BF4FA2D506E0}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBarDataModels", "..\SushiBarDataModels\SushiBarDataModels.csproj", "{98946D8E-A8FC-40DC-9FC8-BCBBC6BD6688}" EndProject diff --git a/SushiBar/SushiBar.csproj b/SushiBar/SushiBarView.csproj similarity index 71% rename from SushiBar/SushiBar.csproj rename to SushiBar/SushiBarView.csproj index 0adb268..fbd600f 100644 --- a/SushiBar/SushiBar.csproj +++ b/SushiBar/SushiBarView.csproj @@ -16,4 +16,10 @@ + + + + + + \ No newline at end of file diff --git a/SushiBar/Sushis/FormSushi.Designer.cs b/SushiBar/Sushis/FormSushi.Designer.cs new file mode 100644 index 0000000..1f2ff0f --- /dev/null +++ b/SushiBar/Sushis/FormSushi.Designer.cs @@ -0,0 +1,247 @@ +namespace SushiBarView +{ + partial class FormSushi + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelName = new Label(); + labelPrice = new Label(); + textBoxName = new TextBox(); + textBoxPrice = new TextBox(); + groupBoxComponents = new GroupBox(); + buttonRefresh = new Button(); + buttonDelete = new Button(); + buttonUpdate = new Button(); + buttonAdd = new Button(); + dataGridView = new DataGridView(); + ColumnId = new DataGridViewTextBoxColumn(); + ColumnName = new DataGridViewTextBoxColumn(); + ColumnCount = new DataGridViewTextBoxColumn(); + buttonSave = new Button(); + buttonCancel = new Button(); + groupBoxComponents.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(26, 16); + labelName.Margin = new Padding(2, 0, 2, 0); + labelName.Name = "labelName"; + labelName.Size = new Size(79, 21); + labelName.TabIndex = 0; + labelName.Text = "Название"; + // + // labelPrice + // + labelPrice.AutoSize = true; + labelPrice.Location = new Point(26, 53); + labelPrice.Margin = new Padding(2, 0, 2, 0); + labelPrice.Name = "labelPrice"; + labelPrice.Size = new Size(90, 21); + labelPrice.TabIndex = 1; + labelPrice.Text = "Стоимость"; + // + // textBoxName + // + textBoxName.Location = new Point(124, 9); + textBoxName.Margin = new Padding(2, 3, 2, 3); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(261, 28); + textBoxName.TabIndex = 2; + // + // textBoxPrice + // + textBoxPrice.Enabled = false; + textBoxPrice.Location = new Point(124, 53); + textBoxPrice.Margin = new Padding(2, 3, 2, 3); + textBoxPrice.Name = "textBoxPrice"; + textBoxPrice.Size = new Size(261, 28); + textBoxPrice.TabIndex = 3; + // + // groupBoxComponents + // + groupBoxComponents.Controls.Add(buttonRefresh); + groupBoxComponents.Controls.Add(buttonDelete); + groupBoxComponents.Controls.Add(buttonUpdate); + groupBoxComponents.Controls.Add(buttonAdd); + groupBoxComponents.Controls.Add(dataGridView); + groupBoxComponents.Location = new Point(26, 94); + groupBoxComponents.Margin = new Padding(2, 3, 2, 3); + groupBoxComponents.Name = "groupBoxComponents"; + groupBoxComponents.Padding = new Padding(2, 3, 2, 3); + groupBoxComponents.Size = new Size(674, 396); + groupBoxComponents.TabIndex = 5; + groupBoxComponents.TabStop = false; + groupBoxComponents.Text = "Компоненты"; + // + // buttonRefresh + // + buttonRefresh.BackColor = Color.FromArgb(255, 192, 192); + buttonRefresh.Location = new Point(483, 330); + buttonRefresh.Name = "buttonRefresh"; + buttonRefresh.Size = new Size(127, 47); + buttonRefresh.TabIndex = 9; + buttonRefresh.Text = "Обновить"; + buttonRefresh.UseVisualStyleBackColor = false; + buttonRefresh.Click += ButtonRef_Click; + // + // buttonDelete + // + buttonDelete.BackColor = Color.FromArgb(255, 192, 192); + buttonDelete.Location = new Point(483, 228); + buttonDelete.Name = "buttonDelete"; + buttonDelete.Size = new Size(127, 47); + buttonDelete.TabIndex = 8; + buttonDelete.Text = "Удалить"; + buttonDelete.UseVisualStyleBackColor = false; + buttonDelete.Click += ButtonDel_Click; + // + // buttonUpdate + // + buttonUpdate.BackColor = Color.FromArgb(255, 192, 192); + buttonUpdate.Location = new Point(483, 125); + buttonUpdate.Name = "buttonUpdate"; + buttonUpdate.Size = new Size(127, 47); + buttonUpdate.TabIndex = 7; + buttonUpdate.Text = "Изменить"; + buttonUpdate.UseVisualStyleBackColor = false; + buttonUpdate.Click += ButtonUpd_Click; + // + // buttonAdd + // + buttonAdd.BackColor = Color.FromArgb(255, 192, 192); + buttonAdd.Location = new Point(483, 27); + buttonAdd.Name = "buttonAdd"; + buttonAdd.Size = new Size(127, 47); + buttonAdd.TabIndex = 6; + buttonAdd.Text = "Добавить"; + buttonAdd.UseVisualStyleBackColor = false; + buttonAdd.Click += ButtonAdd_Click; + // + // dataGridView + // + dataGridView.AllowUserToAddRows = false; + dataGridView.AllowUserToResizeRows = false; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; + dataGridView.BackgroundColor = Color.FromArgb(255, 192, 192); + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Columns.AddRange(new DataGridViewColumn[] { ColumnId, ColumnName, ColumnCount }); + dataGridView.Location = new Point(13, 27); + dataGridView.Margin = new Padding(2, 3, 2, 3); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(381, 350); + dataGridView.TabIndex = 5; + // + // ColumnId + // + ColumnId.HeaderText = "id"; + ColumnId.MinimumWidth = 6; + ColumnId.Name = "ColumnId"; + ColumnId.Visible = false; + // + // ColumnName + // + ColumnName.HeaderText = "Компонент"; + ColumnName.MinimumWidth = 6; + ColumnName.Name = "ColumnName"; + // + // ColumnCount + // + ColumnCount.HeaderText = "Количество"; + ColumnCount.MinimumWidth = 6; + ColumnCount.Name = "ColumnCount"; + // + // buttonSave + // + buttonSave.BackColor = Color.FromArgb(255, 192, 192); + buttonSave.Location = new Point(428, 521); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(127, 47); + buttonSave.TabIndex = 10; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = false; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.BackColor = Color.FromArgb(255, 192, 192); + buttonCancel.Location = new Point(572, 520); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(127, 47); + buttonCancel.TabIndex = 11; + buttonCancel.Text = "Отменить"; + buttonCancel.UseVisualStyleBackColor = false; + buttonCancel.Click += ButtonCancel_Click; + // + // FormSushi + // + AutoScaleDimensions = new SizeF(9F, 21F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.Cornsilk; + ClientSize = new Size(723, 580); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(groupBoxComponents); + Controls.Add(textBoxPrice); + Controls.Add(textBoxName); + Controls.Add(labelPrice); + Controls.Add(labelName); + Font = new Font("Candara", 10.2F, FontStyle.Regular, GraphicsUnit.Point, 204); + Margin = new Padding(3, 4, 3, 4); + Name = "FormSushi"; + Text = "Суши"; + Load += FormSushi_Load; + groupBoxComponents.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelName; + private Label labelPrice; + private TextBox textBoxName; + private TextBox textBoxPrice; + private GroupBox groupBoxComponents; + private Button buttonRefresh; + private Button buttonDelete; + private Button buttonUpdate; + private Button buttonAdd; + private DataGridView dataGridView; + private DataGridViewTextBoxColumn ColumnId; + private DataGridViewTextBoxColumn ColumnName; + private DataGridViewTextBoxColumn ColumnCount; + private Button buttonSave; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/SushiBar/Sushis/FormSushi.cs b/SushiBar/Sushis/FormSushi.cs new file mode 100644 index 0000000..44be721 --- /dev/null +++ b/SushiBar/Sushis/FormSushi.cs @@ -0,0 +1,204 @@ +using Microsoft.Extensions.Logging; +using SushiBar; +using SushiBarContracts.BindingModel; +using SushiBarContracts.BusinessLogicsContracts; +using SushiBarContracts.SearchModel; +using SushiBarDataModels.Models; + + +namespace SushiBarView +{ + public partial class FormSushi : Form + { + private readonly ILogger _logger; + private readonly ISushiLogic _logic; + private int? _id; + private Dictionary _sushiComponents; + public int Id { set { _id = value; } } + public FormSushi(ILogger logger, ISushiLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + _sushiComponents = new Dictionary(); + } + private void FormSushi_Load(object sender, EventArgs e) + { + if (_id.HasValue) + { + _logger.LogInformation("Загрузка изделия"); + try + { + var view = _logic.ReadElement(new SushiSearchModel{ Id = _id.Value }); + if (view != null) + { + textBoxName.Text = view.SushiName; + textBoxPrice.Text = view.Price.ToString(); + _sushiComponents = view.SushiComponents ?? new Dictionary(); + LoadData(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки изделия"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + private void LoadData() + { + _logger.LogInformation("Загрузка компонент изделия"); + try + { + if (_sushiComponents != null) + { + dataGridView.Rows.Clear(); + foreach (var pc in _sushiComponents) + { + dataGridView.Rows.Add(new object[] { pc.Key, pc.Value.Item1.ComponentName, pc.Value.Item2 }); + } + textBoxPrice.Text = CalcPrice().ToString(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки компонент изделия"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonAdd_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormSushiComponent)); + if (service is FormSushiComponent form) + { + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } + _logger.LogInformation("Добавление нового компонента: { ComponentName} - { Count}", + form.ComponentModel.ComponentName, form.Count); + if (_sushiComponents.ContainsKey(form.Id)) + { + _sushiComponents[form.Id] = (form.ComponentModel, form.Count); + } + else + { + _sushiComponents.Add(form.Id, (form.ComponentModel, form.Count)); + } + LoadData(); + } + } + } + private void ButtonUpd_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(FormSushiComponent)); + if (service is FormSushiComponent form) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value); + form.Id = id; + form.Count = _sushiComponents[id].Item2; + if (form.ShowDialog() == DialogResult.OK) + { + if (form.ComponentModel == null) + { + return; + } + _logger.LogInformation("Изменение компонента: { ComponentName} - { Count} ", + form.ComponentModel.ComponentName, form.Count); + _sushiComponents[form.Id] = (form.ComponentModel, form.Count); + LoadData(); + } + } + } + } + private void ButtonDel_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + try + { + _logger.LogInformation("Удаление компонента: { ComponentName} - { Count}", + dataGridView.SelectedRows[0].Cells[1].Value); + _sushiComponents?.Remove(Convert.ToInt32(dataGridView.SelectedRows[0].Cells[0].Value)); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + } + LoadData(); + } + } + } + private void ButtonRef_Click(object sender, EventArgs e) + { + LoadData(); + } + private void ButtonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxName.Text)) + { + MessageBox.Show("Заполните название", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxPrice.Text)) + { + MessageBox.Show("Заполните цену", "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + return; + } + if (_sushiComponents == null || _sushiComponents.Count == 0) + { + MessageBox.Show("Заполните компоненты", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Сохранение изделия"); + try + { + var model = new SushiBindingModel + { + Id = _id ?? 0, + SushiName = textBoxName.Text, + Price = Convert.ToDouble(textBoxPrice.Text), + SushiComponents = _sushiComponents + }; + var operationResult = _id.HasValue ? _logic.Update(model) : + _logic.Create(model); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения изделия"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + private double CalcPrice() + { + double price = 0; + foreach (var elem in _sushiComponents) + { + price += ((elem.Value.Item1?.Cost ?? 0) * elem.Value.Item2); + } + return Math.Round(price * 1.1, 2); + } + } +} diff --git a/SushiBar/Sushis/FormSushi.resx b/SushiBar/Sushis/FormSushi.resx new file mode 100644 index 0000000..fcacbcb --- /dev/null +++ b/SushiBar/Sushis/FormSushi.resx @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + True + + + True + + + True + + \ No newline at end of file diff --git a/SushiBar/Sushis/FormSushiComponent.Designer.cs b/SushiBar/Sushis/FormSushiComponent.Designer.cs new file mode 100644 index 0000000..b7aa03d --- /dev/null +++ b/SushiBar/Sushis/FormSushiComponent.Designer.cs @@ -0,0 +1,137 @@ +namespace SushiBarView +{ + partial class FormSushiComponent + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + labelComponent = new Label(); + labelCountComponent = new Label(); + buttonSave = new Button(); + textBoxComponentCount = new TextBox(); + comboBoxComponent = new ComboBox(); + buttonCancel = new Button(); + SuspendLayout(); + // + // labelComponent + // + labelComponent.AutoSize = true; + labelComponent.Location = new Point(35, 39); + labelComponent.Margin = new Padding(4, 0, 4, 0); + labelComponent.Name = "labelComponent"; + labelComponent.Size = new Size(107, 24); + labelComponent.TabIndex = 0; + labelComponent.Text = "Компонент"; + // + // labelCountComponent + // + labelCountComponent.AutoSize = true; + labelCountComponent.Location = new Point(35, 128); + labelCountComponent.Margin = new Padding(4, 0, 4, 0); + labelCountComponent.Name = "labelCountComponent"; + labelCountComponent.Size = new Size(112, 24); + labelCountComponent.TabIndex = 1; + labelCountComponent.Text = "Количество"; + // + // buttonSave + // + buttonSave.BackColor = Color.Green; + buttonSave.BackgroundImageLayout = ImageLayout.Center; + buttonSave.Cursor = Cursors.Hand; + buttonSave.ForeColor = SystemColors.ControlLightLight; + buttonSave.Location = new Point(205, 197); + buttonSave.Margin = new Padding(4); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(132, 54); + buttonSave.TabIndex = 2; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = false; + buttonSave.Click += ButtonSave_Click; + // + // textBoxComponentCount + // + textBoxComponentCount.Location = new Point(205, 125); + textBoxComponentCount.Margin = new Padding(4); + textBoxComponentCount.Name = "textBoxComponentCount"; + textBoxComponentCount.Size = new Size(293, 32); + textBoxComponentCount.TabIndex = 3; + // + // comboBoxComponent + // + comboBoxComponent.Cursor = Cursors.Hand; + comboBoxComponent.DropDownStyle = ComboBoxStyle.DropDownList; + comboBoxComponent.FormattingEnabled = true; + comboBoxComponent.Location = new Point(205, 36); + comboBoxComponent.Margin = new Padding(4); + comboBoxComponent.Name = "comboBoxComponent"; + comboBoxComponent.Size = new Size(293, 32); + comboBoxComponent.TabIndex = 4; + // + // buttonCancel + // + buttonCancel.BackColor = Color.Green; + buttonCancel.BackgroundImageLayout = ImageLayout.Center; + buttonCancel.Cursor = Cursors.Hand; + buttonCancel.ForeColor = SystemColors.ControlLightLight; + buttonCancel.Location = new Point(362, 197); + buttonCancel.Margin = new Padding(4); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(136, 54); + buttonCancel.TabIndex = 5; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = false; + buttonCancel.Click += ButtonCancel_Click; + // + // FormSushiComponent + // + AutoScaleDimensions = new SizeF(11F, 24F); + AutoScaleMode = AutoScaleMode.Font; + BackColor = Color.FromArgb(210, 255, 200); + ClientSize = new Size(542, 280); + Controls.Add(buttonCancel); + Controls.Add(comboBoxComponent); + Controls.Add(textBoxComponentCount); + Controls.Add(buttonSave); + Controls.Add(labelCountComponent); + Controls.Add(labelComponent); + Font = new Font("Candara", 12F, FontStyle.Regular, GraphicsUnit.Point, 204); + Margin = new Padding(4); + Name = "FormSushiComponent"; + Text = "Компонент изделия"; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelComponent; + private Label labelCountComponent; + private Button buttonSave; + private TextBox textBoxComponentCount; + private ComboBox comboBoxComponent; + private Button buttonCancel; + } +} \ No newline at end of file diff --git a/SushiBar/Sushis/FormSushiComponent.cs b/SushiBar/Sushis/FormSushiComponent.cs new file mode 100644 index 0000000..f7e93d9 --- /dev/null +++ b/SushiBar/Sushis/FormSushiComponent.cs @@ -0,0 +1,80 @@ +using SushiBarContracts.BusinessLogicsContracts; +using SushiBarContracts.ViewModels; +using SushiBarDataModels.Models; + +namespace SushiBarView +{ + public partial class FormSushiComponent : Form + { + private readonly List? _list; + public int Id + { + get + { + return Convert.ToInt32(comboBoxComponent.SelectedValue); + } + set + { + comboBoxComponent.SelectedValue = value; + } + } + public IComponentModel? ComponentModel + { + get + { + if (_list == null) + { + return null; + } + foreach (var elem in _list) + { + if (elem.Id == Id) + { + return elem; + } + } + return null; + } + } + public int Count + { + get { return Convert.ToInt32(textBoxComponentCount.Text); } + set + { textBoxComponentCount.Text = value.ToString(); } + } + public FormSushiComponent(IComponentLogic logic) + { + InitializeComponent(); + _list = logic.ReadList(null); + if (_list != null) + { + comboBoxComponent.DisplayMember = "ComponentName"; + comboBoxComponent.ValueMember = "Id"; + comboBoxComponent.DataSource = _list; + comboBoxComponent.SelectedItem = null; + } + } + private void ButtonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxComponentCount.Text)) + { + MessageBox.Show("Заполните поле Количество", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (comboBoxComponent.SelectedValue == null) + { + MessageBox.Show("Выберите компонент", "Ошибка", + MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + DialogResult = DialogResult.OK; + Close(); + } + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/SushiBar/Sushis/FormSushiComponent.resx b/SushiBar/Sushis/FormSushiComponent.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SushiBar/Sushis/FormSushiComponent.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SushiBar/Sushis/FormSushis.Designer.cs b/SushiBar/Sushis/FormSushis.Designer.cs new file mode 100644 index 0000000..f649f9e --- /dev/null +++ b/SushiBar/Sushis/FormSushis.Designer.cs @@ -0,0 +1,123 @@ +namespace SushiBarView +{ + partial class FormSushis + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Windows Form Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() + { + buttonRefreshSushi = new Button(); + buttonRemoveSushi = new Button(); + buttonUpdateSushi = new Button(); + buttonAddSushi = new Button(); + dataGridView = new DataGridView(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // buttonRefreshSushi + // + buttonRefreshSushi.Font = new Font("Candara", 12F); + buttonRefreshSushi.Location = new Point(658, 424); + buttonRefreshSushi.Name = "buttonRefreshSushi"; + buttonRefreshSushi.Size = new Size(121, 46); + buttonRefreshSushi.TabIndex = 9; + buttonRefreshSushi.Text = "Обновить"; + buttonRefreshSushi.UseVisualStyleBackColor = true; + buttonRefreshSushi.Click += buttonRefreshSushis_Click; + // + // buttonRemoveSushi + // + buttonRemoveSushi.Font = new Font("Candara", 12F); + buttonRemoveSushi.Location = new Point(658, 287); + buttonRemoveSushi.Name = "buttonRemoveSushi"; + buttonRemoveSushi.Size = new Size(121, 46); + buttonRemoveSushi.TabIndex = 8; + buttonRemoveSushi.Text = "Удалить"; + buttonRemoveSushi.UseVisualStyleBackColor = true; + buttonRemoveSushi.Click += buttonRemoveSushi_Click; + // + // buttonUpdateSushi + // + buttonUpdateSushi.Font = new Font("Candara", 12F); + buttonUpdateSushi.Location = new Point(658, 147); + buttonUpdateSushi.Name = "buttonUpdateSushi"; + buttonUpdateSushi.Size = new Size(121, 46); + buttonUpdateSushi.TabIndex = 7; + buttonUpdateSushi.Text = "Изменить"; + buttonUpdateSushi.UseVisualStyleBackColor = true; + buttonUpdateSushi.Click += buttonUpdateSushi_Click; + // + // buttonAddSushi + // + buttonAddSushi.Font = new Font("Candara", 12F); + buttonAddSushi.Location = new Point(658, 15); + buttonAddSushi.Name = "buttonAddSushi"; + buttonAddSushi.Size = new Size(121, 46); + buttonAddSushi.TabIndex = 6; + buttonAddSushi.Text = "Добавить"; + buttonAddSushi.UseVisualStyleBackColor = true; + buttonAddSushi.Click += buttonAddSushi_Click; + // + // dataGridView + // + dataGridView.BackgroundColor = Color.DarkSalmon; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Dock = DockStyle.Left; + dataGridView.Location = new Point(0, 0); + dataGridView.MultiSelect = false; + dataGridView.Name = "dataGridView"; + dataGridView.ReadOnly = true; + dataGridView.RowHeadersVisible = false; + dataGridView.RowHeadersWidth = 51; + dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect; + dataGridView.Size = new Size(569, 509); + dataGridView.TabIndex = 5; + // + // FormSushis + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(851, 509); + Controls.Add(buttonRefreshSushi); + Controls.Add(buttonRemoveSushi); + Controls.Add(buttonUpdateSushi); + Controls.Add(buttonAddSushi); + Controls.Add(dataGridView); + Name = "FormSushis"; + Text = "Суши"; + Load += FormSushis_Load; + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Button buttonRefreshSushi; + private Button buttonRemoveSushi; + private Button buttonUpdateSushi; + private Button buttonAddSushi; + private DataGridView dataGridView; + } +} \ No newline at end of file diff --git a/SushiBar/Sushis/FormSushis.cs b/SushiBar/Sushis/FormSushis.cs new file mode 100644 index 0000000..a8098d5 --- /dev/null +++ b/SushiBar/Sushis/FormSushis.cs @@ -0,0 +1,122 @@ +using Microsoft.Extensions.Logging; +using SushiBar; +using SushiBarContracts.BindingModel; +using SushiBarContracts.BusinessLogicsContracts; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Data; +using System.Drawing; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; + +namespace SushiBarView +{ + public partial class FormSushis : Form + { + private readonly ILogger _logger; + private readonly ISushiLogic _logic; + private int? _id; + public int Id + { + set { _id = value; } + } + public FormSushis(ILogger logger, ISushiLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void FormSushis_Load(object sender, EventArgs e) + { + LoadData(); + } + private void LoadData() + { + try + { + var list = _logic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["SushiName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + dataGridView.Columns["SushiComponents"].Visible = false; + } + _logger.LogInformation("Загрузка списка суш"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки суш"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void buttonAddSushi_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormSushi)); + if (service is FormSushi form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void buttonUpdateSushi_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = + Program.ServiceProvider?.GetService(typeof(FormSushi)); + if (service is FormSushi form) + { + form.Id = + Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void buttonRemoveSushi_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", + MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Удаление компонента"); + try + { + if (!_logic.Delete(new SushiBindingModel + { + Id = id + })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления компонента"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void buttonRefreshSushis_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/SushiBar/Sushis/FormSushis.resx b/SushiBar/Sushis/FormSushis.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SushiBar/Sushis/FormSushis.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/SushiBar/nlog.config b/SushiBar/nlog.config new file mode 100644 index 0000000..cf12ddf --- /dev/null +++ b/SushiBar/nlog.config @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SushiBarListImplements/DataListSingleton.cs b/SushiBarListImplements/DataListSingleton.cs index 7ec7d73..309dfcd 100644 --- a/SushiBarListImplements/DataListSingleton.cs +++ b/SushiBarListImplements/DataListSingleton.cs @@ -1,6 +1,4 @@ -using SushiBarListImplements.Components; -using SushiBarListImplements.Orders; -using SushiBarListImplements.Sushis; +using SushiBarListImplements.Models; namespace SushiBarListImplement { diff --git a/SushiBarListImplements/Components/ComponentStorage.cs b/SushiBarListImplements/Implements/ComponentStorage.cs similarity index 97% rename from SushiBarListImplements/Components/ComponentStorage.cs rename to SushiBarListImplements/Implements/ComponentStorage.cs index 9562488..f9bcd8d 100644 --- a/SushiBarListImplements/Components/ComponentStorage.cs +++ b/SushiBarListImplements/Implements/ComponentStorage.cs @@ -3,8 +3,9 @@ using SushiBarContracts.SearchModel; using SushiBarContracts.StoragesContracts; using SushiBarContracts.ViewModels; using SushiBarListImplement; +using SushiBarListImplements.Models; -namespace SushiBarListImplements.Components +namespace SushiBarListImplements.Implements { public class ComponentStorage : IComponentStorage { diff --git a/SushiBarListImplements/Orders/OrderStorage.cs b/SushiBarListImplements/Implements/OrderStorage.cs similarity index 97% rename from SushiBarListImplements/Orders/OrderStorage.cs rename to SushiBarListImplements/Implements/OrderStorage.cs index 2e046a7..2f4337e 100644 --- a/SushiBarListImplements/Orders/OrderStorage.cs +++ b/SushiBarListImplements/Implements/OrderStorage.cs @@ -3,8 +3,9 @@ using SushiBarContracts.SearchModel; using SushiBarContracts.StoragesContracts; using SushiBarContracts.ViewModels; using SushiBarListImplement; +using SushiBarListImplements.Models; -namespace SushiBarListImplements.Orders +namespace SushiBarListImplements.Implements { public class OrderStorage : IOrderStorage { diff --git a/SushiBarListImplements/Sushis/SushiStorage.cs b/SushiBarListImplements/Implements/SushiStorage.cs similarity index 97% rename from SushiBarListImplements/Sushis/SushiStorage.cs rename to SushiBarListImplements/Implements/SushiStorage.cs index 48ebca2..cd5a131 100644 --- a/SushiBarListImplements/Sushis/SushiStorage.cs +++ b/SushiBarListImplements/Implements/SushiStorage.cs @@ -3,8 +3,9 @@ using SushiBarContracts.SearchModel; using SushiBarContracts.StoragesContracts; using SushiBarContracts.ViewModels; using SushiBarListImplement; +using SushiBarListImplements.Models; -namespace SushiBarListImplements.Sushis +namespace SushiBarListImplements.Implements { public class SushiStorage : ISushiStorage { diff --git a/SushiBarListImplements/Components/Component.cs b/SushiBarListImplements/Models/Component.cs similarity index 96% rename from SushiBarListImplements/Components/Component.cs rename to SushiBarListImplements/Models/Component.cs index e03724d..b617439 100644 --- a/SushiBarListImplements/Components/Component.cs +++ b/SushiBarListImplements/Models/Component.cs @@ -2,7 +2,7 @@ using SushiBarContracts.ViewModels; using SushiBarDataModels.Models; -namespace SushiBarListImplements.Components +namespace SushiBarListImplements.Models { public class Component : IComponentModel { diff --git a/SushiBarListImplements/Orders/Order.cs b/SushiBarListImplements/Models/Order.cs similarity index 97% rename from SushiBarListImplements/Orders/Order.cs rename to SushiBarListImplements/Models/Order.cs index 50617a1..a0a3e5a 100644 --- a/SushiBarListImplements/Orders/Order.cs +++ b/SushiBarListImplements/Models/Order.cs @@ -4,7 +4,7 @@ using SushiBarDataModels.Models; using SushiBarDataModels; using SushiBarDataModels.Enums; -namespace SushiBarListImplements.Orders +namespace SushiBarListImplements.Models { public class Order : IOrderModel { diff --git a/SushiBarListImplements/Sushis/Sushi.cs b/SushiBarListImplements/Models/Sushi.cs similarity index 97% rename from SushiBarListImplements/Sushis/Sushi.cs rename to SushiBarListImplements/Models/Sushi.cs index 6c35561..c951a1a 100644 --- a/SushiBarListImplements/Sushis/Sushi.cs +++ b/SushiBarListImplements/Models/Sushi.cs @@ -2,7 +2,7 @@ using SushiBarContracts.ViewModels; using SushiBarDataModels.Models; -namespace SushiBarListImplements.Sushis +namespace SushiBarListImplements.Models { public class Sushi : ISushiModel {