diff --git a/SushiBar/FormComponent.Designer.cs b/SushiBar/FormComponent.Designer.cs index 4ca4ffa..cbf4f9c 100644 --- a/SushiBar/FormComponent.Designer.cs +++ b/SushiBar/FormComponent.Designer.cs @@ -83,6 +83,7 @@ buttonSaveComponent.TabIndex = 4; buttonSaveComponent.Text = "Сохранить"; buttonSaveComponent.UseVisualStyleBackColor = true; + buttonSaveComponent.Click += buttonSaveComponent_Click; // // buttonCancel // @@ -95,7 +96,7 @@ buttonCancel.UseVisualStyleBackColor = true; buttonCancel.Click += buttonCancel_Click; // - // FormComponents + // FormComponent // AutoScaleDimensions = new SizeF(11F, 24F); AutoScaleMode = AutoScaleMode.Font; @@ -108,7 +109,7 @@ Controls.Add(labelComponentName); Font = new Font("Candara", 12F, FontStyle.Regular, GraphicsUnit.Point, 204); Margin = new Padding(4); - Name = "FormComponents"; + Name = "FormComponent"; Text = "Компонент"; Load += FormComponents_Load; ResumeLayout(false); diff --git a/SushiBar/FormComponent.cs b/SushiBar/FormComponent.cs index dd966ce..66f5df9 100644 --- a/SushiBar/FormComponent.cs +++ b/SushiBar/FormComponent.cs @@ -53,8 +53,7 @@ namespace SushiBarView { if (string.IsNullOrEmpty(textBoxComponentName.Text)) { - MessageBox.Show("Заполните название", "Ошибка", - MessageBoxButtons.OK, MessageBoxIcon.Error); + MessageBox.Show("Заполните название", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); return; } _logger.LogInformation("Сохранение компонента"); @@ -66,8 +65,7 @@ namespace SushiBarView ComponentName = textBoxComponentName.Text, Cost = Convert.ToDouble(textBoxComponentCost.Text) }; - var operationResult = _id.HasValue ? _logic.Update(model) : - _logic.Create(model); + var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); if (!operationResult) { throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); @@ -80,8 +78,7 @@ namespace SushiBarView catch (Exception ex) { _logger.LogError(ex, "Ошибка сохранения компонента"); - MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, - MessageBoxIcon.Error); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); } } diff --git a/SushiBar/FormComponents.Designer.cs b/SushiBar/FormComponents.Designer.cs index b55cd7e..5db3d6c 100644 --- a/SushiBar/FormComponents.Designer.cs +++ b/SushiBar/FormComponents.Designer.cs @@ -82,7 +82,7 @@ buttonRemoveComponent.TabIndex = 3; buttonRemoveComponent.Text = "Удалить"; buttonRemoveComponent.UseVisualStyleBackColor = true; - buttonRemoveComponent.Click += buttonUpdateComponent_Click; + buttonRemoveComponent.Click += buttonRemoveComponent_Click; // // buttonRefreshComponents // diff --git a/SushiBar/FormComponents.cs b/SushiBar/FormComponents.cs index a453798..5c496d9 100644 --- a/SushiBar/FormComponents.cs +++ b/SushiBar/FormComponents.cs @@ -119,5 +119,6 @@ namespace SushiBarView { LoadData(); } + } } diff --git a/SushiBar/FormCreateOrder.Designer.cs b/SushiBar/FormCreateOrder.Designer.cs new file mode 100644 index 0000000..6cd491f --- /dev/null +++ b/SushiBar/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/FormCreateOrder.cs b/SushiBar/FormCreateOrder.cs new file mode 100644 index 0000000..7e6b04f --- /dev/null +++ b/SushiBar/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/FormCreateOrder.resx b/SushiBar/FormCreateOrder.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SushiBar/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/FormMain.Designer.cs b/SushiBar/FormMain.Designer.cs new file mode 100644 index 0000000..8fe0865 --- /dev/null +++ b/SushiBar/FormMain.Designer.cs @@ -0,0 +1,173 @@ +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 = "Суши Бар"; + 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..a0623c8 --- /dev/null +++ b/SushiBar/FormMain.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + \ No newline at end of file diff --git a/SushiBar/FormSushi.Designer.cs b/SushiBar/FormSushi.Designer.cs index 1ef515d..1b2c9e7 100644 --- a/SushiBar/FormSushi.Designer.cs +++ b/SushiBar/FormSushi.Designer.cs @@ -146,8 +146,9 @@ // // dataGridView // + dataGridView.AllowUserToAddRows = false; dataGridView.AllowUserToResizeRows = false; - dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; + dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; dataGridView.BackgroundColor = Color.FromArgb(255, 192, 192); dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; dataGridView.Columns.AddRange(new DataGridViewColumn[] { ColumnId, ColumnName, ColumnCount }); @@ -166,21 +167,18 @@ ColumnId.MinimumWidth = 6; ColumnId.Name = "ColumnId"; ColumnId.Visible = false; - ColumnId.Width = 125; // // ColumnName // ColumnName.HeaderText = "Компонент"; ColumnName.MinimumWidth = 6; ColumnName.Name = "ColumnName"; - ColumnName.Width = 124; // // ColumnCount // ColumnCount.HeaderText = "Количество"; ColumnCount.MinimumWidth = 6; ColumnCount.Name = "ColumnCount"; - ColumnCount.Width = 126; // // buttonSave // diff --git a/SushiBar/FormSushi.cs b/SushiBar/FormSushi.cs index 05431e1..44be721 100644 --- a/SushiBar/FormSushi.cs +++ b/SushiBar/FormSushi.cs @@ -29,10 +29,7 @@ namespace SushiBarView _logger.LogInformation("Загрузка изделия"); try { - var view = _logic.ReadElement(new SushiSearchModel - { - Id = _id.Value - }); + var view = _logic.ReadElement(new SushiSearchModel{ Id = _id.Value }); if (view != null) { textBoxName.Text = view.SushiName; diff --git a/SushiBar/FormSushiComponent.cs b/SushiBar/FormSushiComponent.cs index c7e8078..f7e93d9 100644 --- a/SushiBar/FormSushiComponent.cs +++ b/SushiBar/FormSushiComponent.cs @@ -1,15 +1,6 @@ using SushiBarContracts.BusinessLogicsContracts; using SushiBarContracts.ViewModels; using SushiBarDataModels.Models; -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 { diff --git a/SushiBar/FormSushis.Designer.cs b/SushiBar/FormSushis.Designer.cs new file mode 100644 index 0000000..6450735 --- /dev/null +++ b/SushiBar/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 = "FormSushis"; + 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/FormSushis.cs b/SushiBar/FormSushis.cs new file mode 100644 index 0000000..a8098d5 --- /dev/null +++ b/SushiBar/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/FormSushis.resx b/SushiBar/FormSushis.resx new file mode 100644 index 0000000..af32865 --- /dev/null +++ b/SushiBar/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/Program.cs b/SushiBar/Program.cs index 1999b64..a0a80e2 100644 --- a/SushiBar/Program.cs +++ b/SushiBar/Program.cs @@ -27,7 +27,7 @@ namespace SushiBar var services = new ServiceCollection(); ConfigureServices(services); _serviceProvider = services.BuildServiceProvider(); - //Application.Run(_serviceProvider.GetRequiredService()); + Application.Run(_serviceProvider.GetRequiredService()); //Application.Run(new Form1()); } diff --git a/SushiBar/SushiBar.sln b/SushiBar/SushiBar.sln index d4c455e..89f7155 100644 --- a/SushiBar/SushiBar.sln +++ b/SushiBar/SushiBar.sln @@ -5,13 +5,13 @@ VisualStudioVersion = 17.8.34525.116 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SushiBarView", "SushiBarView.csproj", "{57C61C1C-B600-41E0-BEAC-667A8FC14F8C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBarDataModels", "..\ClassLibrary1SushiBarDataModels\SushiBarDataModels.csproj", "{AEC2E098-CC1B-44E3-BF4F-6532E6712317}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SushiBarDataModels", "..\ClassLibrary1SushiBarDataModels\SushiBarDataModels.csproj", "{AEC2E098-CC1B-44E3-BF4F-6532E6712317}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBarContracts", "..\SushiBarContracts\SushiBarContracts.csproj", "{582D62F3-67BC-48E4-BE59-413A8692695B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SushiBarContracts", "..\SushiBarContracts\SushiBarContracts.csproj", "{582D62F3-67BC-48E4-BE59-413A8692695B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBarBusinessLogic", "..\SushiBarBusinessLogic\SushiBarBusinessLogic.csproj", "{5C6C02C5-88B1-4CCE-884D-415E40A94AD8}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SushiBarBusinessLogic", "..\SushiBarBusinessLogic\SushiBarBusinessLogic.csproj", "{5C6C02C5-88B1-4CCE-884D-415E40A94AD8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SushiBarListImplement", "..\SushiBarListImplement\SushiBarListImplement.csproj", "{99652DC5-71FC-4100-834F-4CD8D14A4AAA}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SushiBarListImplement", "..\SushiBarListImplement\SushiBarListImplement.csproj", "{99652DC5-71FC-4100-834F-4CD8D14A4AAA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/SushiBarBusinessLogic/OrderLogic.cs b/SushiBarBusinessLogic/OrderLogic.cs index 5c7745c..ac24cdd 100644 --- a/SushiBarBusinessLogic/OrderLogic.cs +++ b/SushiBarBusinessLogic/OrderLogic.cs @@ -13,7 +13,7 @@ namespace SushiBarBusinessLogic.BusinessLogic private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; - public OrderLogic(ILogger logger, IOrderStorage orderStorage) + public OrderLogic(ILogger logger, IOrderStorage orderStorage) { _logger = logger; _orderStorage = orderStorage; @@ -35,14 +35,13 @@ namespace SushiBarBusinessLogic.BusinessLogic public bool CreateOrder(OrderBindingModel model) { CheckModel(model); - if (model.Status == OrderStatus.Неизвестен) return false; + if (model.Status != OrderStatus.Неизвестен) return false; + model.Status = OrderStatus.Принят; if (_orderStorage.Insert(model) == null) { - model.Status = OrderStatus.Неизвестен; _logger.LogWarning("Insert operation failed"); return false; } - model.Status = OrderStatus.Принят; return true; } @@ -106,34 +105,20 @@ namespace SushiBarBusinessLogic.BusinessLogic if (!withParams) return; - if (model.Count < 0) - throw new ArgumentNullException("Количество суш в заказе не может быть меньше нуля", nameof(model.Count)); + if (model.SushiId <= 0) + throw new ArgumentNullException("Неверный идентификатор суши", nameof(model.SushiId)); - if (model.Sum < 0) + if (model.Count <= 0) + throw new ArgumentNullException("Количество суш в заказе не может быть меньше нуля или равно нулю", nameof(model.Count)); + + if (model.Sum <= 0) throw new ArgumentNullException("Стоимость заказа не может быть меньше нуля", nameof(model.Sum)); - if (model.DateImplement.HasValue & model.DateImplement < model.DateCreate) + if (model.DateImplement.HasValue && model.DateImplement < model.DateCreate) throw new ArithmeticException("Заказ должен быть выдан позже, чем был создан"); _logger.LogInformation("Sushi. SushiId:{SushiId}. Count:{ Count}. Sum:{ Sum}. Id: { Id}", model.SushiId, model.Count, model.Sum, model.Id); } - - /*public OrderViewModel? ReadElement(OrderSearchModel model) - { - if (model == null) - { - throw new ArgumentNullException(nameof(model)); - } - _logger.LogInformation("ReadElement. SushiName:{SushiName}.Id:{ Id}", model.SushiName, model.Id); - var element = _sushiStorage.GetElement(model); - if (element == null) - { - _logger.LogWarning("ReadElement element not found"); - return null; - } - _logger.LogInformation("ReadElement find. Id:{Id}", element.Id); - return element; - }*/ } } diff --git a/SushiBarDataModels/IComponentModel.cs b/SushiBarDataModels/IComponentModel.cs new file mode 100644 index 0000000..04bdc2d --- /dev/null +++ b/SushiBarDataModels/IComponentModel.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarDataModels.Models +{ + public interface IComponentModel + { + string ComponentName { get; } + double Cost { get; } + } +} diff --git a/SushiBarDataModels/IId.cs b/SushiBarDataModels/IId.cs new file mode 100644 index 0000000..ae2dcff --- /dev/null +++ b/SushiBarDataModels/IId.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarDataModels +{ + public interface IId + { + int Id { get; } + } +} diff --git a/SushiBarDataModels/IOrderModel.cs b/SushiBarDataModels/IOrderModel.cs new file mode 100644 index 0000000..4e2c03d --- /dev/null +++ b/SushiBarDataModels/IOrderModel.cs @@ -0,0 +1,14 @@ +using SushiBarDataModels.Enums; + +namespace SushiBarDataModels +{ + public interface IOrderModel : IId + { + int SushiId { get; } + int Count { get; } + double Sum { get; } + OrderStatus Status { get; } + DateTime DateCreate { get; } + DateTime? DateImplement { get; } + } +} diff --git a/SushiBarDataModels/ISushiModel.cs b/SushiBarDataModels/ISushiModel.cs new file mode 100644 index 0000000..a04e269 --- /dev/null +++ b/SushiBarDataModels/ISushiModel.cs @@ -0,0 +1,9 @@ +namespace SushiBarDataModels.Models +{ + public interface ISushiModel : IId + { + string SushiName { get; } + double Price { get; } + Dictionary SushiComponents { get; } + } +} diff --git a/SushiBarDataModels/OrderStatus.cs b/SushiBarDataModels/OrderStatus.cs new file mode 100644 index 0000000..c1b6d91 --- /dev/null +++ b/SushiBarDataModels/OrderStatus.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SushiBarDataModels.Enums +{ + public enum OrderStatus + { + Неизвестен = -1, + Принят = 0, + Выполняется = 1, + Готов = 2, + Выдан = 3 + } +} diff --git a/SushiBarDataModels/SushiBarDataModels.csproj b/SushiBarDataModels/SushiBarDataModels.csproj new file mode 100644 index 0000000..fa71b7a --- /dev/null +++ b/SushiBarDataModels/SushiBarDataModels.csproj @@ -0,0 +1,9 @@ + + + + net8.0 + enable + enable + + +