diff --git a/FlowerShop/FlowerShop/FormCreateOrder.cs b/FlowerShop/FlowerShop/FormCreateOrder.cs index 842786f..8ac37a0 100644 --- a/FlowerShop/FlowerShop/FormCreateOrder.cs +++ b/FlowerShop/FlowerShop/FormCreateOrder.cs @@ -103,6 +103,7 @@ namespace FlowerShopView { var operationResult = _logicO.CreateOrder(new OrderBindingModel { + ClientId = Convert.ToInt32(comboBoxClient.SelectedValue), FlowerId = Convert.ToInt32(comboBoxFlower.SelectedValue), Count = Convert.ToInt32(textBoxCount.Text), Sum = Convert.ToDouble(textBoxSum.Text) diff --git a/FlowerShop/FlowerShop/FormImplementer.Designer.cs b/FlowerShop/FlowerShop/FormImplementer.Designer.cs new file mode 100644 index 0000000..b5e4521 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementer.Designer.cs @@ -0,0 +1,172 @@ +namespace FlowerShopView +{ + partial class FormImplementer + { + /// + /// 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() + { + FioTextBox = new TextBox(); + FioLabel = new Label(); + PasswordTextBox = new TextBox(); + PasswordLabel = new Label(); + WorkExperienceLabel = new Label(); + WorkExperienceNumericUpDown = new NumericUpDown(); + QualificationNumericUpDown = new NumericUpDown(); + QualificationLabel = new Label(); + CancelButton = new Button(); + SaveButton = new Button(); + ((System.ComponentModel.ISupportInitialize)WorkExperienceNumericUpDown).BeginInit(); + ((System.ComponentModel.ISupportInitialize)QualificationNumericUpDown).BeginInit(); + SuspendLayout(); + // + // FioTextBox + // + FioTextBox.Location = new Point(137, 9); + FioTextBox.Margin = new Padding(3, 2, 3, 2); + FioTextBox.Name = "FioTextBox"; + FioTextBox.Size = new Size(335, 23); + FioTextBox.TabIndex = 3; + // + // FioLabel + // + FioLabel.AutoSize = true; + FioLabel.Location = new Point(10, 12); + FioLabel.Name = "FioLabel"; + FioLabel.Size = new Size(112, 15); + FioLabel.TabIndex = 2; + FioLabel.Text = "ФИО исполнителя:"; + // + // PasswordTextBox + // + PasswordTextBox.Location = new Point(137, 40); + PasswordTextBox.Margin = new Padding(3, 2, 3, 2); + PasswordTextBox.Name = "PasswordTextBox"; + PasswordTextBox.Size = new Size(335, 23); + PasswordTextBox.TabIndex = 5; + // + // PasswordLabel + // + PasswordLabel.AutoSize = true; + PasswordLabel.Location = new Point(10, 43); + PasswordLabel.Name = "PasswordLabel"; + PasswordLabel.Size = new Size(52, 15); + PasswordLabel.TabIndex = 4; + PasswordLabel.Text = "Пароль:"; + // + // WorkExperienceLabel + // + WorkExperienceLabel.AutoSize = true; + WorkExperienceLabel.Location = new Point(10, 75); + WorkExperienceLabel.Name = "WorkExperienceLabel"; + WorkExperienceLabel.Size = new Size(84, 15); + WorkExperienceLabel.TabIndex = 6; + WorkExperienceLabel.Text = "Опыт работы:"; + // + // WorkExperienceNumericUpDown + // + WorkExperienceNumericUpDown.Location = new Point(137, 73); + WorkExperienceNumericUpDown.Margin = new Padding(3, 2, 3, 2); + WorkExperienceNumericUpDown.Name = "WorkExperienceNumericUpDown"; + WorkExperienceNumericUpDown.Size = new Size(108, 23); + WorkExperienceNumericUpDown.TabIndex = 8; + // + // QualificationNumericUpDown + // + QualificationNumericUpDown.Location = new Point(137, 106); + QualificationNumericUpDown.Margin = new Padding(3, 2, 3, 2); + QualificationNumericUpDown.Name = "QualificationNumericUpDown"; + QualificationNumericUpDown.Size = new Size(108, 23); + QualificationNumericUpDown.TabIndex = 10; + // + // QualificationLabel + // + QualificationLabel.AutoSize = true; + QualificationLabel.Location = new Point(10, 108); + QualificationLabel.Name = "QualificationLabel"; + QualificationLabel.Size = new Size(91, 15); + QualificationLabel.TabIndex = 9; + QualificationLabel.Text = "Квалификация:"; + // + // CancelButton + // + CancelButton.Location = new Point(353, 142); + CancelButton.Margin = new Padding(3, 2, 3, 2); + CancelButton.Name = "CancelButton"; + CancelButton.Size = new Size(119, 30); + CancelButton.TabIndex = 12; + CancelButton.Text = "Отмена"; + CancelButton.UseVisualStyleBackColor = true; + CancelButton.Click += CancelButton_Click; + // + // SaveButton + // + SaveButton.Location = new Point(233, 142); + SaveButton.Margin = new Padding(3, 2, 3, 2); + SaveButton.Name = "SaveButton"; + SaveButton.Size = new Size(114, 30); + SaveButton.TabIndex = 11; + SaveButton.Text = "Сохранить"; + SaveButton.UseVisualStyleBackColor = true; + SaveButton.Click += SaveButton_Click; + // + // FormImplementer + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(482, 183); + Controls.Add(CancelButton); + Controls.Add(SaveButton); + Controls.Add(QualificationNumericUpDown); + Controls.Add(QualificationLabel); + Controls.Add(WorkExperienceNumericUpDown); + Controls.Add(WorkExperienceLabel); + Controls.Add(PasswordTextBox); + Controls.Add(PasswordLabel); + Controls.Add(FioTextBox); + Controls.Add(FioLabel); + Margin = new Padding(3, 2, 3, 2); + Name = "FormImplementer"; + Text = "Исполнитель"; + Load += FormImplementer_Load; + ((System.ComponentModel.ISupportInitialize)WorkExperienceNumericUpDown).EndInit(); + ((System.ComponentModel.ISupportInitialize)QualificationNumericUpDown).EndInit(); + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private TextBox FioTextBox; + private Label FioLabel; + private TextBox PasswordTextBox; + private Label PasswordLabel; + private Label WorkExperienceLabel; + private NumericUpDown WorkExperienceNumericUpDown; + private NumericUpDown QualificationNumericUpDown; + private Label QualificationLabel; + private Button CancelButton; + private Button SaveButton; + } +} \ No newline at end of file diff --git a/FlowerShop/FlowerShop/FormImplementer.cs b/FlowerShop/FlowerShop/FormImplementer.cs new file mode 100644 index 0000000..1376e46 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementer.cs @@ -0,0 +1,105 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using Microsoft.Extensions.Logging; + +namespace FlowerShopView +{ + public partial class FormImplementer : Form + { + private readonly ILogger _logger; + private readonly IImplementerLogic _logic; + + private int? _id; + + public int Id { set { _id = value; } } + + public FormImplementer(ILogger Logger, IImplementerLogic Logic) + { + InitializeComponent(); + + _logger = Logger; + _logic = Logic; + } + + private void FormImplementer_Load(object sender, EventArgs e) + { + if (_id.HasValue) + { + try + { + _logger.LogInformation("Получение исполнителя"); + + var View = _logic.ReadElement(new ImplementerSearchModel + { + Id = _id.Value + }); + + if (View != null) + { + FioTextBox.Text = View.ImplementerFIO; + PasswordTextBox.Text = View.Password; + WorkExperienceNumericUpDown.Value = View.WorkExperience; + QualificationNumericUpDown.Value = View.Qualification; + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void SaveButton_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(FioTextBox.Text)) + { + MessageBox.Show("Заполните ФИО", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + if (string.IsNullOrEmpty(PasswordTextBox.Text)) + { + MessageBox.Show("Заполните пароль", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + + _logger.LogInformation("Сохранение исполнителя"); + + try + { + var Model = new ImplementerBindingModel + { + Id = _id ?? 0, + ImplementerFIO = FioTextBox.Text, + Password = PasswordTextBox.Text, + WorkExperience = (int)WorkExperienceNumericUpDown.Value, + Qualification = (int)QualificationNumericUpDown.Value + }; + + 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 CancelButton_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} diff --git a/FlowerShop/FlowerShop/FormImplementer.resx b/FlowerShop/FlowerShop/FormImplementer.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementer.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/FlowerShop/FlowerShop/FormImplementers.Designer.cs b/FlowerShop/FlowerShop/FormImplementers.Designer.cs new file mode 100644 index 0000000..d86d181 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementers.Designer.cs @@ -0,0 +1,135 @@ +namespace FlowerShopView +{ + partial class FormImplementers + { + /// + /// 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() + { + ToolsPanel = new Panel(); + RefreshButton = new Button(); + DeleteButton = new Button(); + UpdateButton = new Button(); + AddButton = new Button(); + DataGridView = new DataGridView(); + ToolsPanel.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)DataGridView).BeginInit(); + SuspendLayout(); + // + // ToolsPanel + // + ToolsPanel.Controls.Add(RefreshButton); + ToolsPanel.Controls.Add(DeleteButton); + ToolsPanel.Controls.Add(UpdateButton); + ToolsPanel.Controls.Add(AddButton); + ToolsPanel.Location = new Point(532, 9); + ToolsPanel.Margin = new Padding(3, 2, 3, 2); + ToolsPanel.Name = "ToolsPanel"; + ToolsPanel.Size = new Size(116, 320); + ToolsPanel.TabIndex = 3; + // + // RefreshButton + // + RefreshButton.Location = new Point(3, 126); + RefreshButton.Margin = new Padding(3, 2, 3, 2); + RefreshButton.Name = "RefreshButton"; + RefreshButton.Size = new Size(110, 27); + RefreshButton.TabIndex = 3; + RefreshButton.Text = "Обновить"; + RefreshButton.UseVisualStyleBackColor = true; + RefreshButton.Click += RefreshButton_Click; + // + // DeleteButton + // + DeleteButton.Location = new Point(3, 84); + DeleteButton.Margin = new Padding(3, 2, 3, 2); + DeleteButton.Name = "DeleteButton"; + DeleteButton.Size = new Size(110, 27); + DeleteButton.TabIndex = 2; + DeleteButton.Text = "Удалить"; + DeleteButton.UseVisualStyleBackColor = true; + DeleteButton.Click += DeleteButton_Click; + // + // UpdateButton + // + UpdateButton.Location = new Point(3, 42); + UpdateButton.Margin = new Padding(3, 2, 3, 2); + UpdateButton.Name = "UpdateButton"; + UpdateButton.Size = new Size(110, 27); + UpdateButton.TabIndex = 1; + UpdateButton.Text = "Изменить"; + UpdateButton.UseVisualStyleBackColor = true; + UpdateButton.Click += UpdateButton_Click; + // + // AddButton + // + AddButton.Location = new Point(3, 2); + AddButton.Margin = new Padding(3, 2, 3, 2); + AddButton.Name = "AddButton"; + AddButton.Size = new Size(110, 27); + AddButton.TabIndex = 0; + AddButton.Text = "Добавить"; + AddButton.UseVisualStyleBackColor = true; + AddButton.Click += AddButton_Click; + // + // DataGridView + // + DataGridView.AllowUserToAddRows = false; + DataGridView.AllowUserToDeleteRows = false; + DataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + DataGridView.Location = new Point(10, 9); + DataGridView.Margin = new Padding(3, 2, 3, 2); + DataGridView.Name = "DataGridView"; + DataGridView.ReadOnly = true; + DataGridView.RowHeadersWidth = 51; + DataGridView.RowTemplate.Height = 29; + DataGridView.Size = new Size(516, 320); + DataGridView.TabIndex = 2; + // + // FormImplementers + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(653, 338); + Controls.Add(ToolsPanel); + Controls.Add(DataGridView); + Margin = new Padding(3, 2, 3, 2); + Name = "FormImplementers"; + Text = "Исполнители"; + Load += FormImplementers_Load; + ToolsPanel.ResumeLayout(false); + ((System.ComponentModel.ISupportInitialize)DataGridView).EndInit(); + ResumeLayout(false); + } + + #endregion + + private Panel ToolsPanel; + private Button RefreshButton; + private Button DeleteButton; + private Button UpdateButton; + private Button AddButton; + private DataGridView DataGridView; + } +} \ No newline at end of file diff --git a/FlowerShop/FlowerShop/FormImplementers.cs b/FlowerShop/FlowerShop/FormImplementers.cs new file mode 100644 index 0000000..4ebd464 --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementers.cs @@ -0,0 +1,111 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; + +namespace FlowerShopView +{ + public partial class FormImplementers : Form + { + private readonly ILogger _logger; + private readonly IImplementerLogic _implementerLogic; + + public FormImplementers(ILogger Logger, IImplementerLogic ImplementerLogic) + { + InitializeComponent(); + + _logger = Logger; + _implementerLogic = ImplementerLogic; + } + + private void LoadData() + { + try + { + var List = _implementerLogic.ReadList(null); + + if (List != null) + { + DataGridView.DataSource = List; + DataGridView.Columns["Id"].Visible = false; + DataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + + _logger.LogInformation("Загрузка исполнителей"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки исполнителей"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void FormImplementers_Load(object sender, EventArgs e) + { + LoadData(); + } + + private void AddButton_Click(object sender, EventArgs e) + { + var Service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + + if (Service is FormImplementer Form) + { + if (Form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void UpdateButton_Click(object sender, EventArgs e) + { + if (DataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + if (service is FormImplementer Form) + { + Form.Id = Convert.ToInt32(DataGridView.SelectedRows[0].Cells["Id"].Value); + if (Form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void DeleteButton_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 (!_implementerLogic.Delete(new ImplementerBindingModel + { + Id = Id + })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void RefreshButton_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/FlowerShop/FlowerShop/FormImplementers.resx b/FlowerShop/FlowerShop/FormImplementers.resx new file mode 100644 index 0000000..a395bff --- /dev/null +++ b/FlowerShop/FlowerShop/FormImplementers.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/FlowerShop/FlowerShop/FormMain.Designer.cs b/FlowerShop/FlowerShop/FormMain.Designer.cs index cfc8f29..0ee62b2 100644 --- a/FlowerShop/FlowerShop/FormMain.Designer.cs +++ b/FlowerShop/FlowerShop/FormMain.Designer.cs @@ -22,6 +22,178 @@ #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(); + справочникиToolStripMenuItem = new ToolStripMenuItem(); + ЦветыToolStripMenuItem = new ToolStripMenuItem(); + КомпонентыToolStripMenuItem = new ToolStripMenuItem(); + клиентыToolStripMenuItem = new ToolStripMenuItem(); + исполнителиToolStripMenuItem = new ToolStripMenuItem(); + отчётыToolStripMenuItem = new ToolStripMenuItem(); + списокЦветковToolStripMenuItem = new ToolStripMenuItem(); + компонентыПоЦветамToolStripMenuItem = new ToolStripMenuItem(); + списокЗаказовToolStripMenuItem = new ToolStripMenuItem(); + запускToolStripMenuItem = new ToolStripMenuItem(); + dataGridView = new DataGridView(); + buttonCreateOrder = new Button(); + buttonIssuedOrder = new Button(); + buttonRef = new Button(); + menuStrip1.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).BeginInit(); + SuspendLayout(); + // + // menuStrip1 + // + menuStrip1.ImageScalingSize = new Size(20, 20); + menuStrip1.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem, запускToolStripMenuItem }); + menuStrip1.Location = new Point(0, 0); + menuStrip1.Name = "menuStrip1"; + menuStrip1.Padding = new Padding(7, 3, 0, 3); + menuStrip1.Size = new Size(1102, 30); + menuStrip1.TabIndex = 0; + menuStrip1.Text = "menuStrip1"; + // + // справочникиToolStripMenuItem + // + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { ЦветыToolStripMenuItem, КомпонентыToolStripMenuItem, клиентыToolStripMenuItem, исполнителиToolStripMenuItem }); + справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; + справочникиToolStripMenuItem.Size = new Size(117, 24); + справочникиToolStripMenuItem.Text = "Справочники"; + // + // ЦветыToolStripMenuItem + // + ЦветыToolStripMenuItem.Name = "ЦветыToolStripMenuItem"; + ЦветыToolStripMenuItem.Size = new Size(185, 26); + ЦветыToolStripMenuItem.Text = "Цветы"; + ЦветыToolStripMenuItem.Click += ЦветыToolStripMenuItem_Click; + // + // КомпонентыToolStripMenuItem + // + КомпонентыToolStripMenuItem.Name = "КомпонентыToolStripMenuItem"; + КомпонентыToolStripMenuItem.Size = new Size(185, 26); + КомпонентыToolStripMenuItem.Text = "Компоненты"; + КомпонентыToolStripMenuItem.Click += КомпонентыToolStripMenuItem_Click; + // + // клиентыToolStripMenuItem + // + клиентыToolStripMenuItem.Name = "клиентыToolStripMenuItem"; + клиентыToolStripMenuItem.Size = new Size(185, 26); + клиентыToolStripMenuItem.Text = "Клиенты"; + клиентыToolStripMenuItem.Click += клиентыToolStripMenuItem_Click; + // + // исполнителиToolStripMenuItem + // + исполнителиToolStripMenuItem.Name = "исполнителиToolStripMenuItem"; + исполнителиToolStripMenuItem.Size = new Size(185, 26); + исполнителиToolStripMenuItem.Text = "Исполнители"; + исполнителиToolStripMenuItem.Click += исполнителиToolStripMenuItem_Click; + // + // отчётыToolStripMenuItem + // + отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { списокЦветковToolStripMenuItem, компонентыПоЦветамToolStripMenuItem, списокЗаказовToolStripMenuItem }); + отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; + отчётыToolStripMenuItem.Size = new Size(73, 24); + отчётыToolStripMenuItem.Text = "Отчёты"; + // + // списокЦветковToolStripMenuItem + // + списокЦветковToolStripMenuItem.Name = "списокЦветковToolStripMenuItem"; + списокЦветковToolStripMenuItem.Size = new Size(258, 26); + списокЦветковToolStripMenuItem.Text = "Список цветков"; + списокЦветковToolStripMenuItem.Click += списокЦветковToolStripMenuItem_Click; + // + // компонентыПоЦветамToolStripMenuItem + // + компонентыПоЦветамToolStripMenuItem.Name = "компонентыПоЦветамToolStripMenuItem"; + компонентыПоЦветамToolStripMenuItem.Size = new Size(258, 26); + компонентыПоЦветамToolStripMenuItem.Text = "Компоненты по цветам"; + компонентыПоЦветамToolStripMenuItem.Click += компонентыПоЦветамToolStripMenuItem_Click; + // + // списокЗаказовToolStripMenuItem + // + списокЗаказовToolStripMenuItem.Name = "списокЗаказовToolStripMenuItem"; + списокЗаказовToolStripMenuItem.Size = new Size(258, 26); + списокЗаказовToolStripMenuItem.Text = "Список заказов"; + списокЗаказовToolStripMenuItem.Click += списокЗаказовToolStripMenuItem_Click; + // + // запускToolStripMenuItem + // + запускToolStripMenuItem.Name = "запускToolStripMenuItem"; + запускToolStripMenuItem.Size = new Size(114, 24); + запускToolStripMenuItem.Text = "Запуск работ"; + запускToolStripMenuItem.Click += запускToolStripMenuItem_Click; + // + // dataGridView + // + dataGridView.BackgroundColor = Color.White; + dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; + dataGridView.Location = new Point(14, 36); + dataGridView.Margin = new Padding(3, 4, 3, 4); + dataGridView.Name = "dataGridView"; + dataGridView.RowHeadersWidth = 51; + dataGridView.RowTemplate.Height = 25; + dataGridView.Size = new Size(845, 548); + dataGridView.TabIndex = 1; + // + // buttonCreateOrder + // + buttonCreateOrder.Location = new Point(886, 73); + buttonCreateOrder.Margin = new Padding(3, 4, 3, 4); + buttonCreateOrder.Name = "buttonCreateOrder"; + buttonCreateOrder.Size = new Size(181, 43); + buttonCreateOrder.TabIndex = 2; + buttonCreateOrder.Text = "Создать заказ"; + buttonCreateOrder.UseVisualStyleBackColor = true; + buttonCreateOrder.Click += ButtonCreateOrder_Click; + // + // buttonIssuedOrder + // + buttonIssuedOrder.Location = new Point(886, 147); + buttonIssuedOrder.Margin = new Padding(3, 4, 3, 4); + buttonIssuedOrder.Name = "buttonIssuedOrder"; + buttonIssuedOrder.Size = new Size(181, 43); + buttonIssuedOrder.TabIndex = 3; + buttonIssuedOrder.Text = "Заказ выдан"; + buttonIssuedOrder.UseVisualStyleBackColor = true; + buttonIssuedOrder.Click += ButtonIssuedOrder_Click; + // + // buttonRef + // + buttonRef.Location = new Point(886, 220); + buttonRef.Margin = new Padding(3, 4, 3, 4); + buttonRef.Name = "buttonRef"; + buttonRef.Size = new Size(181, 43); + buttonRef.TabIndex = 6; + buttonRef.Text = "Обновить список"; + buttonRef.UseVisualStyleBackColor = true; + buttonRef.Click += ButtonRef_Click; + // + // FormMain + // + AutoScaleDimensions = new SizeF(8F, 20F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(1102, 600); + Controls.Add(buttonRef); + Controls.Add(buttonIssuedOrder); + Controls.Add(buttonCreateOrder); + Controls.Add(dataGridView); + Controls.Add(menuStrip1); + MainMenuStrip = menuStrip1; + Margin = new Padding(3, 4, 3, 4); + Name = "FormMain"; + Text = "Цветочный магазин"; + Load += FormMain_Load; + menuStrip1.ResumeLayout(false); + menuStrip1.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)dataGridView).EndInit(); + ResumeLayout(false); + PerformLayout(); + } /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. @@ -253,6 +425,7 @@ PerformLayout(); } + #endregion private void ПродажаЦветовToolStripMenuItem_Click(object sender, EventArgs e) { throw new NotImplementedException(); @@ -260,6 +433,10 @@ #endregion + private MenuStrip menuStrip1; + private ToolStripMenuItem справочникиToolStripMenuItem; + private ToolStripMenuItem ЦветыToolStripMenuItem; + private ToolStripMenuItem КомпонентыToolStripMenuItem; private MenuStrip menuStrip1; private ToolStripMenuItem справочникиToolStripMenuItem; private ToolStripMenuItem ЦветыToolStripMenuItem; @@ -269,6 +446,17 @@ private ToolStripMenuItem компонентыПоЦветамToolStripMenuItem; private ToolStripMenuItem списокЗаказовToolStripMenuItem; private DataGridView dataGridView; + private Button buttonCreateOrder; + private Button buttonIssuedOrder; + private Button buttonRef; + private ToolStripMenuItem отчётыToolStripMenuItem; + private ToolStripMenuItem списокЦветковToolStripMenuItem; + private ToolStripMenuItem компонентыПоЦветамToolStripMenuItem; + private ToolStripMenuItem списокЗаказовToolStripMenuItem; + private ToolStripMenuItem клиентыToolStripMenuItem; + private ToolStripMenuItem исполнителиToolStripMenuItem; + private ToolStripMenuItem запускToolStripMenuItem; + } private Button buttonCreateOrder; private Button buttonTakeOrderInWork; private Button buttonOrderReady; diff --git a/FlowerShop/FlowerShop/FormMain.cs b/FlowerShop/FlowerShop/FormMain.cs index 7a41687..0685bf5 100644 --- a/FlowerShop/FlowerShop/FormMain.cs +++ b/FlowerShop/FlowerShop/FormMain.cs @@ -4,6 +4,98 @@ using Microsoft.Extensions.Logging; namespace FlowerShopView { + public partial class FormMain : Form + { + private readonly ILogger _logger; + private readonly IOrderLogic _orderLogic; + private readonly IReportLogic _reportLogic; + private readonly IWorkProcess _workProcess; + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess) + { + InitializeComponent(); + _logger = logger; + _orderLogic = orderLogic; + _reportLogic = reportLogic; + _workProcess = workProcess; + } + private void FormMain_Load(object sender, EventArgs e) + { + LoadData(); + } + private void LoadData() + { + _logger.LogInformation("Загрузка заказов"); + try + { + var list = _orderLogic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["FlowerId"].Visible = false; + dataGridView.Columns["ClientId"].Visible = false; + dataGridView.Columns["ImplementerId"].Visible = false; + } + } + 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(FormFlowers)); + if (service is FormFlowers form) + { + form.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 ButtonIssuedOrder_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(); + } public partial class FormMain : Form { private readonly ILogger _logger; @@ -193,6 +285,30 @@ namespace FlowerShopView } } + private void клиентыToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormClients)); + if (service is FormClients form) + { + form.ShowDialog(); + } + } + + private void исполнителиToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + if (service is FormImplementers form) + { + form.ShowDialog(); + } + } + + private void запускToolStripMenuItem_Click(object sender, EventArgs e) + { + _workProcess.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение",MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } private void заказыПоДатамToolStripMenuItem_Click(object sender, EventArgs e) { var service = Program.ServiceProvider?.GetService(typeof(FormReportGroupedOrders)); diff --git a/FlowerShop/FlowerShop/Program.cs b/FlowerShop/FlowerShop/Program.cs index 9d13619..55bc78c 100644 --- a/FlowerShop/FlowerShop/Program.cs +++ b/FlowerShop/FlowerShop/Program.cs @@ -40,6 +40,7 @@ namespace FlowerShopView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -48,6 +49,8 @@ namespace FlowerShopView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -78,6 +81,8 @@ namespace FlowerShopView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); } } } \ No newline at end of file diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/ImplementerLogic.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/ImplementerLogic.cs new file mode 100644 index 0000000..98a1cad --- /dev/null +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/ImplementerLogic.cs @@ -0,0 +1,128 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace FlowerShopBusinessLogic.BusinessLogics +{ + public class ImplementerLogic : IImplementerLogic + { + private readonly ILogger _logger; + private readonly IImplementerStorage _implementerStorage; + public ImplementerLogic(ILogger Logger, IImplementerStorage ImplementerStorage) + { + _logger = Logger; + _implementerStorage = ImplementerStorage; + } + public List? ReadList(ImplementerSearchModel? Model) + { + _logger.LogInformation("ReadList. ImplementerFIO: {ImplementerFIO}. Password: {Password}. Id: {Id}", + Model?.ImplementerFIO, Model?.Password?.Length, Model?.Id); + + var List = Model == null ? _implementerStorage.GetFullList() : _implementerStorage.GetFilteredList(Model); + + if (List == null) + { + _logger.LogWarning("ReadList return null list"); + return null; + } + + _logger.LogInformation("ReadList. Count: {Count}", List.Count); + return List; + } + public ImplementerViewModel? ReadElement(ImplementerSearchModel Model) + { + if (Model is null) + { + throw new ArgumentNullException(nameof(Model)); + } + + _logger.LogInformation("ReadElement. ImplementerFIO: {ImplementerFIO}. Password: {Password}. Id: {Id}", + Model?.ImplementerFIO, Model?.Password?.Length, Model?.Id); + + var Element = _implementerStorage.GetElement(Model); + + if (Element == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + + _logger.LogInformation("ReadElement find. Id: {Id}", Element.Id); + return Element; + } + public bool Create(ImplementerBindingModel Model) + { + CheckModel(Model); + + if (_implementerStorage.Insert(Model) == null) + { + _logger.LogWarning("Insert operation failed"); + return false; + } + + return true; + } + public bool Update(ImplementerBindingModel Model) + { + CheckModel(Model); + + if (_implementerStorage.Update(Model) == null) + { + _logger.LogWarning("Update operation failed"); + return false; + } + + return true; + } + public bool Delete(ImplementerBindingModel Model) + { + CheckModel(Model, false); + + _logger.LogInformation("Delete. Id:{Id}", Model.Id); + + if (_implementerStorage.Delete(Model) == null) + { + _logger.LogWarning("Delete operation failed"); + return false; + } + + return true; + } + private void CheckModel(ImplementerBindingModel Model, bool WithParams = true) + { + if (Model == null) + throw new ArgumentNullException(nameof(Model)); + + if (!WithParams) + return; + + if (string.IsNullOrEmpty(Model.ImplementerFIO)) + throw new ArgumentNullException("Нет ФИО исполнителя", nameof(Model.ImplementerFIO)); + + if (string.IsNullOrEmpty(Model.Password)) + throw new ArgumentNullException("Нет пароля исполнителя", nameof(Model.Password)); + + if (Model.WorkExperience < 0) + throw new ArgumentNullException("Стаж должен быть неотрицательным целым числом", nameof(Model.WorkExperience)); + + if (Model.Qualification < 0) + throw new ArgumentNullException("Квалификация должна быть неотрицательным целым числом", nameof(Model.Qualification)); + + _logger.LogInformation("Implementer. ImplementerFIO: {ImplementerFIO}. Password: {Password}. WorkExperience: {WorkExperience}. Qualification: {Qualification}. Id: {Id}", + Model.ImplementerFIO, Model.Password, Model.WorkExperience, Model.Qualification, Model.Id); + + var Implementer = _implementerStorage.GetElement(new ImplementerSearchModel + { + ImplementerFIO = Model.ImplementerFIO + }); + + if (Implementer != null && Implementer.Id != Model.Id) + { + throw new InvalidOperationException("Исполнитель с таким ФИО уже есть"); + } + } + } +} diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs index 1eb9d59..c82b0ea 100644 --- a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/OrderLogic.cs @@ -13,6 +13,8 @@ namespace FlowerShopBusinessLogic.BusinessLogics { private readonly ILogger _logger; private readonly IOrderStorage _orderStorage; + static readonly object _locker = new object(); + public OrderLogic(ILogger logger, IOrderStorage orderStorage) private readonly IFlowerStorage _flowerStorage; private readonly IShopStorage _shopStorage; private readonly IShopLogic _shopLogic; @@ -36,7 +38,28 @@ namespace FlowerShopBusinessLogic.BusinessLogics _logger.LogInformation("ReadList. Count:{Count}", list.Count); return list; } - public bool CreateOrder(OrderBindingModel model) + public OrderViewModel? ReadElement(OrderSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + + _logger.LogInformation("ReadList. ClientId: {ClientId}. Status: {Status}. ImplementerId: {ImplementerId}. DateFrom: {DateFrom}. DateTo: {DateTo}. OrderId: {Id}", + model?.ClientId, model?.Status, model?.ImplementerId, model?.DateFrom, model?.DateTo, model?.Id); + + var Order = _orderStorage.GetElement(model); + + if (Order == null) + { + _logger.LogWarning("ReadElement element not found"); + return null; + } + + _logger.LogInformation("ReadElement find. Id: {Id}", Order.Id); + return Order; + } + public bool CreateOrder(OrderBindingModel model) { CheckModel(model); if (model.Status != OrderStatus.Неизвестен) @@ -52,7 +75,10 @@ namespace FlowerShopBusinessLogic.BusinessLogics } public bool TakeOrderInWork(OrderBindingModel model) { - return ToNextStatus(model, OrderStatus.Выполняется); + lock (_locker) + { + return ToNextStatus(model, OrderStatus.Выполняется); + } } public bool FinishOrder(OrderBindingModel model) { @@ -78,6 +104,8 @@ namespace FlowerShopBusinessLogic.BusinessLogics model.FlowerId = element.FlowerId; model.DateCreate = element.DateCreate; model.DateImplement = element.DateImplement; + model.ClientId = element.ClientId; + if (!model.ImplementerId.HasValue) model.ImplementerId = element.ImplementerId; model.Status = element.Status; model.Count = element.Count; model.Sum = element.Sum; diff --git a/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs new file mode 100644 index 0000000..51af8c8 --- /dev/null +++ b/FlowerShop/FlowerShopBusinessLogic/BusinessLogics/WorkModeling.cs @@ -0,0 +1,146 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Enums; +using Microsoft.Extensions.Logging; + +namespace FlowerShopBusinessLogic.BusinessLogics +{ + public class WorkModeling : IWorkProcess + { + private readonly ILogger _logger; + private readonly Random _rnd; + private IOrderLogic? _orderLogic; + + public WorkModeling(ILogger Logger) + { + _logger = Logger; + _rnd = new Random(1000); + } + + public void DoWork(IImplementerLogic ImplementerLogic, IOrderLogic OrderLogic) + { + _orderLogic = OrderLogic; + + var Implementers = ImplementerLogic.ReadList(null); + + if (Implementers == null) + { + _logger.LogWarning("DoWork. Implementers is null"); + return; + } + + var Orders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Принят }); + var BeingProcessedOrders = _orderLogic.ReadList(new OrderSearchModel { Status = OrderStatus.Выполняется }); + + if (Orders == null || BeingProcessedOrders == null || (Orders.Count == 0 && BeingProcessedOrders.Count == 0)) + { + _logger.LogWarning("DoWork. Orders is null or empty"); + return; + } + + _logger.LogDebug("DoWork for {Count} orders", Orders.Count); + + foreach (var Implementer in Implementers) + { + Task.Run(() => WorkerWorkAsync(Implementer, Orders)); + } + } + + private async Task WorkerWorkAsync(ImplementerViewModel Implementer, List Orders) + { + if (_orderLogic == null || Implementer == null) + { + return; + } + + await RunOrderInWork(Implementer); + + await Task.Run(() => + { + foreach (var Order in Orders) + { + try + { + _logger.LogDebug("WorkerWorkAsync. Worker {Id} try get order {Order}", Implementer.Id, Order.Id); + + bool AcquireResult = _orderLogic.TakeOrderInWork(new OrderBindingModel + { + Id = Order.Id, + ImplementerId = Implementer.Id + }); + + if (!AcquireResult) + { + _logger.LogDebug("WorkerWorkAsync. Worker {Id} tried to get order {Order} but it's already acquired by other worker", Implementer.Id, Order.Id); + continue; + } + + Thread.Sleep(Implementer.WorkExperience * _rnd.Next(100, 1000) * Order.Count); + + _logger.LogDebug("WorkerWorkAsync. Worker {Id} finish order {Order}", Implementer.Id, Order.Id); + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = Order.Id + }); + Thread.Sleep(Implementer.Qualification * _rnd.Next(10, 100)); + } + + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + } + }); + } + + private async Task RunOrderInWork(ImplementerViewModel Implementer) + { + if (_orderLogic == null || Implementer == null) + return; + + try + { + var RunOrder = await Task.Run(() => _orderLogic.ReadElement(new OrderSearchModel + { + ImplementerId = Implementer.Id, + Status = OrderStatus.Выполняется + })); + + if (RunOrder == null) + { + return; + } + + _logger.LogDebug("RunOrderInWork. Worker {Id} back to order {Order}", Implementer.Id, RunOrder.Id); + Thread.Sleep(Implementer.WorkExperience * _rnd.Next(100, 300) * RunOrder.Count); + + _logger.LogDebug("RunOrderInWork. Worker {Id} finish order {Order}", Implementer.Id, RunOrder.Id); + _orderLogic.FinishOrder(new OrderBindingModel + { + Id = RunOrder.Id + }); + + Thread.Sleep(Implementer.Qualification * _rnd.Next(10, 100)); + } + + catch (InvalidOperationException ex) + { + _logger.LogWarning(ex, "Error try get work"); + } + + catch (Exception ex) + { + _logger.LogError(ex, "Error while do work"); + throw; + } + } + } +} \ No newline at end of file diff --git a/FlowerShop/FlowerShopContracts/BindingModels/ImplementerBindingModel.cs b/FlowerShop/FlowerShopContracts/BindingModels/ImplementerBindingModel.cs new file mode 100644 index 0000000..b5ab22c --- /dev/null +++ b/FlowerShop/FlowerShopContracts/BindingModels/ImplementerBindingModel.cs @@ -0,0 +1,13 @@ +using FlowerShopDataModels.Models; + +namespace FlowerShopContracts.BindingModels +{ + public class ImplementerBindingModel : IImplementerModel + { + public int Id { get; set; } + public string ImplementerFIO { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public int WorkExperience { get; set; } + public int Qualification { get; set; } + } +} diff --git a/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs b/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs index 6888013..0953b1b 100644 --- a/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs +++ b/FlowerShop/FlowerShopContracts/BindingModels/OrderBindingModel.cs @@ -8,7 +8,8 @@ namespace FlowerShopContracts.BindingModels public int Id { get; set; } public int FlowerId { get; set; } public int ClientId { get; set; } - public int Count { get; set; } + public int? ImplementerId { get; set; } + public int Count { get; set; } public double Sum { get; set; } public OrderStatus Status { get; set; } = OrderStatus.Неизвестен; public DateTime DateCreate { get; set; } = DateTime.Now; diff --git a/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IImplementerLogic.cs b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IImplementerLogic.cs new file mode 100644 index 0000000..fe3b9ba --- /dev/null +++ b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IImplementerLogic.cs @@ -0,0 +1,15 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; + +namespace FlowerShopContracts.BusinessLogicsContracts +{ + public interface IImplementerLogic + { + List? ReadList(ImplementerSearchModel? model); + ImplementerViewModel? ReadElement(ImplementerSearchModel model); + bool Create(ImplementerBindingModel model); + bool Update(ImplementerBindingModel model); + bool Delete(ImplementerBindingModel model); + } +} diff --git a/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs index 0449bf8..b6898cf 100644 --- a/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs +++ b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IOrderLogic.cs @@ -7,6 +7,7 @@ namespace FlowerShopContracts.BusinessLogicsContracts public interface IOrderLogic { List? ReadList(OrderSearchModel? model); + OrderViewModel? ReadElement(OrderSearchModel? model); bool CreateOrder(OrderBindingModel model); bool TakeOrderInWork(OrderBindingModel model); bool FinishOrder(OrderBindingModel model); diff --git a/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IWorkProcess.cs b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IWorkProcess.cs new file mode 100644 index 0000000..ac363fe --- /dev/null +++ b/FlowerShop/FlowerShopContracts/BusinessLogicsContracts/IWorkProcess.cs @@ -0,0 +1,8 @@ +namespace FlowerShopContracts.BusinessLogicsContracts +{ + public interface IWorkProcess + { + void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic); + } + +} diff --git a/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs b/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs new file mode 100644 index 0000000..785eed1 --- /dev/null +++ b/FlowerShop/FlowerShopContracts/SearchModels/ImplementerSearchModel.cs @@ -0,0 +1,9 @@ +namespace FlowerShopContracts.SearchModels +{ + public class ImplementerSearchModel + { + public int? Id { get; set; } + public string? ImplementerFIO { get; set; } + public string? Password { get; set; } + } +} diff --git a/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs b/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs index b4a01e5..e9651d2 100644 --- a/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs +++ b/FlowerShop/FlowerShopContracts/SearchModels/OrderSearchModel.cs @@ -1,10 +1,14 @@ -namespace FlowerShopContracts.SearchModels +using FlowerShopDataModels.Enums; + +namespace FlowerShopContracts.SearchModels { public class OrderSearchModel { public int? Id { get; set; } public int? ClientId { get; set; } + public int? ImplementerId { get; set; } public DateTime? DateFrom { get; set; } public DateTime? DateTo { get; set; } + public OrderStatus? Status { get; set; } } } diff --git a/FlowerShop/FlowerShopContracts/StoragesContracts/IImplementerStorage.cs b/FlowerShop/FlowerShopContracts/StoragesContracts/IImplementerStorage.cs new file mode 100644 index 0000000..23f4e4a --- /dev/null +++ b/FlowerShop/FlowerShopContracts/StoragesContracts/IImplementerStorage.cs @@ -0,0 +1,16 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; + +namespace FlowerShopContracts.StoragesContracts +{ + public interface IImplementerStorage + { + List GetFullList(); + List GetFilteredList(ImplementerSearchModel model); + ImplementerViewModel? GetElement(ImplementerSearchModel model); + ImplementerViewModel? Insert(ImplementerBindingModel model); + ImplementerViewModel? Update(ImplementerBindingModel model); + ImplementerViewModel? Delete(ImplementerBindingModel model); + } +} diff --git a/FlowerShop/FlowerShopContracts/ViewModels/ImplementerViewModel.cs b/FlowerShop/FlowerShopContracts/ViewModels/ImplementerViewModel.cs new file mode 100644 index 0000000..c798605 --- /dev/null +++ b/FlowerShop/FlowerShopContracts/ViewModels/ImplementerViewModel.cs @@ -0,0 +1,18 @@ +using FlowerShopDataModels.Models; +using System.ComponentModel; + +namespace FlowerShopContracts.ViewModels +{ + public class ImplementerViewModel : IImplementerModel + { + public int Id { get; set; } + [DisplayName("ФИО исполнителя")] + public string ImplementerFIO { get; set; } = string.Empty; + [DisplayName("Пароль")] + public string Password { get; set; } = string.Empty; + [DisplayName("Опыт исполнителя")] + public int WorkExperience { get; set; } + [DisplayName("Квалификация исполнителя")] + public int Qualification { get; set; } + } +} diff --git a/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs b/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs index a70d495..96038ac 100644 --- a/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs +++ b/FlowerShop/FlowerShopContracts/ViewModels/OrderViewModel.cs @@ -10,12 +10,15 @@ namespace FlowerShopContracts.ViewModels public int Id { get; set; } public int FlowerId { get; set; } public int ClientId { get; set; } + public int? ImplementerId { get; set; } [DisplayName("Изделие")] public string FlowerName { get; set; } = string.Empty; [DisplayName("ФИО клиента")] public string ClientFIO { get; set; } = string.Empty; - [DisplayName("Количество")] - public int Count { get; set; } + [DisplayName("ФИО исполнителя")] + public string ImplementerFIO { get; set; }=string.Empty; + [DisplayName("Количество")] + public int Count { get; set; } [DisplayName("Сумма")] public double Sum { get; set; } [DisplayName("Статус")] diff --git a/FlowerShop/FlowerShopDataModels/Models/IImplementerModel.cs b/FlowerShop/FlowerShopDataModels/Models/IImplementerModel.cs new file mode 100644 index 0000000..dc0a61c --- /dev/null +++ b/FlowerShop/FlowerShopDataModels/Models/IImplementerModel.cs @@ -0,0 +1,11 @@ +namespace FlowerShopDataModels.Models +{ + public interface IImplementerModel : IId + { + string ImplementerFIO { get; } + string Password { get; } + int WorkExperience { get; } + int Qualification { get; } + } + +} diff --git a/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs b/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs index aa308a9..5ab5137 100644 --- a/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs +++ b/FlowerShop/FlowerShopDataModels/Models/IOrderModel.cs @@ -6,6 +6,7 @@ namespace FlowerShopDataModels.Models { int FlowerId { get; } int ClientId { get; } + int? ImplementerId { get; } int Count { get; } double Sum { get; } OrderStatus Status { get; } diff --git a/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabase.cs b/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabase.cs index da5d2cf..4a2ce9a 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabase.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/FlowerShopDatabase.cs @@ -23,5 +23,6 @@ namespace FlowerShopDatabaseImplement public virtual DbSet Shops { set; get; } public virtual DbSet ShopFlowers { set; get; } public virtual DbSet Clients { set; get; } + public virtual DbSet Implementers { set; get; } } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Implements/ImplementerStorage.cs b/FlowerShop/FlowerShopDatabaseImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..75e5cc4 --- /dev/null +++ b/FlowerShop/FlowerShopDatabaseImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,90 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using FlowerShopDatabaseImplement.Models; + +namespace FlowerShopDatabaseImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + public List GetFullList() + { + using var Context = new FlowerShopDatabase(); + + return Context.Implementers.Select(x => x.GetViewModel).ToList(); + } + + public List GetFilteredList(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO)) + { + return new(); + } + using var Context = new FlowerShopDatabase(); + return Context.Implementers.Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)).Select(x => x.GetViewModel).ToList(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.Id.HasValue) + { + return null; + } + + using var Context = new FlowerShopDatabase(); + + return Context.Implementers.FirstOrDefault(x => + (!string.IsNullOrEmpty(model.ImplementerFIO) && x.ImplementerFIO == model.ImplementerFIO && (!string.IsNullOrEmpty(model.Password) ? x.Password == model.Password : true)) || + (model.Id.HasValue && x.Id == model.Id)) + ?.GetViewModel; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + var NewImplementer = Implementer.Create(model); + if (NewImplementer == null) + { + return null; + } + using var Context = new FlowerShopDatabase(); + + Context.Implementers.Add(NewImplementer); + Context.SaveChanges(); + + return NewImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + using var Context = new FlowerShopDatabase(); + + var Implementer = Context.Implementers.FirstOrDefault(x => x.Id == model.Id); + if (Implementer == null) + { + return null; + } + + Implementer.Update(model); + Context.SaveChanges(); + + return Implementer.GetViewModel; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + using var Context = new FlowerShopDatabase(); + + var Implementer = Context.Implementers.FirstOrDefault(rec => rec.Id == model.Id); + if (Implementer == null) + { + return null; + } + + Context.Implementers.Remove(Implementer); + Context.SaveChanges(); + + return Implementer.GetViewModel; + } + } +} diff --git a/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs index b6c2941..30ff169 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Implements/OrderStorage.cs @@ -3,6 +3,7 @@ using FlowerShopContracts.SearchModels; using FlowerShopContracts.StoragesContracts; using FlowerShopContracts.ViewModels; using FlowerShopDatabaseImplement.Models; +using Microsoft.EntityFrameworkCore; namespace FlowerShopDatabaseImplement.Implements { @@ -12,95 +13,96 @@ namespace FlowerShopDatabaseImplement.Implements { using var context = new FlowerShopDatabase(); return context.Orders - .Select(x => AccessFlowerStorage(x.GetViewModel)) - .ToList(); + .Include(x => x.Flower) + .Include(x => x.Client) + .Include(x => x.Implementer) + .Select(x => x.GetViewModel) + .ToList(); } public List GetFilteredList(OrderSearchModel model) { - if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue && !model.ClientId.HasValue) - { - return new(); - } using var context = new FlowerShopDatabase(); if (model.DateFrom.HasValue) + { return context.Orders + .Include(x => x.Flower) + .Include(x => x.Client) + .Include(x => x.Implementer) .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) - && (!model.ClientId.HasValue || x.ClientId == model.ClientId)) - .Select(x => AccessFlowerStorage(x.GetViewModel)).ToList(); + && (!model.ClientId.HasValue || x.ClientId == model.ClientId)) + .Select(x => x.GetViewModel) + .ToList(); + } + return context.Orders + .Include(x => x.Flower) + .Include(x => x.Client) + .Include(x => x.Implementer) .Where(x => (model.Id.HasValue && x.Id == model.Id) - || (model.ClientId.HasValue && x.ClientId == model.ClientId)) - .Select(x => AccessFlowerStorage(x.GetViewModel)).ToList(); + || (model.ClientId.HasValue && x.ClientId == model.ClientId) + || (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId) + || (model.Status.HasValue && x.Status == model.Status)) + .Select(x => x.GetViewModel) + .ToList(); } public OrderViewModel? GetElement(OrderSearchModel model) { - if (!model.Id.HasValue) - { + if (!model.Id.HasValue && !model.ImplementerId.HasValue && !model.Status.HasValue) return null; - } + using var context = new FlowerShopDatabase(); - return AccessFlowerStorage(context.Orders.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel); + + return context.Orders + .Include(x => x.Flower) + .Include(x => x.Client) + .Include(x => x.Implementer) + .FirstOrDefault(x => (model.Id.HasValue && x.Id == model.Id) + || (model.ImplementerId.HasValue && model.Status.HasValue && x.ImplementerId == model.ImplementerId && x.Status == model.Status))? + .GetViewModel; } public OrderViewModel? Insert(OrderBindingModel model) { + if (model == null) + return null; + var newOrder = Order.Create(model); if (newOrder == null) - { return null; - } + using var context = new FlowerShopDatabase(); + context.Orders.Add(newOrder); context.SaveChanges(); - return AccessFlowerStorage(newOrder.GetViewModel); + + return context.Orders.Include(x => x.Flower).Include(x => x.Client).Include(x => x.Implementer).FirstOrDefault(x => x.Id == newOrder.Id)?.GetViewModel; } + public OrderViewModel? Update(OrderBindingModel model) { using var context = new FlowerShopDatabase(); - var order = context.Orders.FirstOrDefault(x => x.Id == - model.Id); + + var order = context.Orders.FirstOrDefault(x => x.Id == model.Id); if (order == null) - { return null; - } + order.Update(model); context.SaveChanges(); - return AccessFlowerStorage(order.GetViewModel); + + return context.Orders.Include(x => x.Flower).Include(x => x.Client).Include(x => x.Implementer).FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; } + public OrderViewModel? Delete(OrderBindingModel model) { using var context = new FlowerShopDatabase(); - var element = context.Orders.FirstOrDefault(rec => rec.Id == model.Id); - if (element != null) - { - context.Orders.Remove(element); - context.SaveChanges(); - return AccessFlowerStorage(element.GetViewModel); - } - return null; - } + var order = context.Orders.Include(x => x.Flower).Include(x => x.Client).Include(x => x.Implementer).FirstOrDefault(rec => rec.Id == model.Id); - public static OrderViewModel AccessFlowerStorage(OrderViewModel model) - { - if (model == null) + if (order == null) return null; - using var context = new FlowerShopDatabase(); - foreach (var Flower in context.Flowers) - { - if (Flower.Id == model.FlowerId) - { - model.FlowerName = Flower.FlowerName; - break; - } - } - foreach (var client in context.Clients) - { - if (client.Id == model.ClientId) - { - model.ClientFIO = client.ClientFIO; - return model; - } - } - return model; + + context.Orders.Remove(order); + context.SaveChanges(); + + return order.GetViewModel; } } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.Designer.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.Designer.cs index 37f674e..2c9a43f 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.Designer.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.Designer.cs @@ -12,7 +12,11 @@ using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; namespace FlowerShopDatabaseImplement.Migrations { [DbContext(typeof(FlowerShopDatabase))] +<<<<<<<< HEAD:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.Designer.cs [Migration("20240517110214_InitCreate")] +======== + [Migration("20240422161656_InitCreate")] +>>>>>>>> origin/lab6:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.Designer.cs partial class InitCreate { protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -115,6 +119,33 @@ namespace FlowerShopDatabaseImplement.Migrations b.ToTable("FlowerComponents"); }); + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Qualification") + .HasColumnType("integer"); + + b.Property("WorkExperience") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Order", b => { b.Property("Id") @@ -138,6 +169,9 @@ namespace FlowerShopDatabaseImplement.Migrations b.Property("FlowerId") .HasColumnType("integer"); + b.Property("ImplementerId") + .HasColumnType("integer"); + b.Property("Status") .HasColumnType("integer"); @@ -150,6 +184,8 @@ namespace FlowerShopDatabaseImplement.Migrations b.HasIndex("FlowerId"); + b.HasIndex("ImplementerId"); + b.ToTable("Orders"); }); @@ -228,7 +264,11 @@ namespace FlowerShopDatabaseImplement.Migrations modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Order", b => { b.HasOne("FlowerShopDatabaseImplement.Models.Client", "Client") +<<<<<<<< HEAD:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.Designer.cs .WithMany("Orders") +======== + .WithMany() +>>>>>>>> origin/lab6:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.Designer.cs .HasForeignKey("ClientId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -239,6 +279,7 @@ namespace FlowerShopDatabaseImplement.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); +<<<<<<<< HEAD:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.Designer.cs b.Navigation("Client"); b.Navigation("Flower"); @@ -266,6 +307,17 @@ namespace FlowerShopDatabaseImplement.Migrations modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Client", b => { b.Navigation("Orders"); +======== + b.HasOne("FlowerShopDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Order") + .HasForeignKey("ImplementerId"); + + b.Navigation("Client"); + + b.Navigation("Flower"); + + b.Navigation("Implementer"); +>>>>>>>> origin/lab6:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.Designer.cs }); modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Component", b => @@ -280,9 +332,15 @@ namespace FlowerShopDatabaseImplement.Migrations b.Navigation("Orders"); }); +<<<<<<<< HEAD:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.Designer.cs modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Shop", b => { b.Navigation("Flowers"); +======== + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Implementer", b => + { + b.Navigation("Order"); +>>>>>>>> origin/lab6:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.Designer.cs }); #pragma warning restore 612, 618 } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.cs index b7a956e..6cd0a9e 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.cs @@ -54,11 +54,16 @@ namespace FlowerShopDatabaseImplement.Migrations }); migrationBuilder.CreateTable( +<<<<<<<< HEAD:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.cs name: "Shops", +======== + name: "Implementers", +>>>>>>>> origin/lab6:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.cs columns: table => new { Id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), +<<<<<<<< HEAD:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.cs ShopName = table.Column(type: "text", nullable: false), Address = table.Column(type: "text", nullable: false), DateOpening = table.Column(type: "timestamp without time zone", nullable: false), @@ -67,6 +72,16 @@ namespace FlowerShopDatabaseImplement.Migrations constraints: table => { table.PrimaryKey("PK_Shops", x => x.Id); +======== + ImplementerFIO = table.Column(type: "text", nullable: false), + Password = table.Column(type: "text", nullable: false), + WorkExperience = table.Column(type: "integer", nullable: false), + Qualification = table.Column(type: "integer", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Implementers", x => x.Id); +>>>>>>>> origin/lab6:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.cs }); migrationBuilder.CreateTable( @@ -104,6 +119,7 @@ namespace FlowerShopDatabaseImplement.Migrations .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), FlowerId = table.Column(type: "integer", nullable: false), ClientId = table.Column(type: "integer", nullable: false), + ImplementerId = table.Column(type: "integer", nullable: true), Count = table.Column(type: "integer", nullable: false), Sum = table.Column(type: "double precision", nullable: false), Status = table.Column(type: "integer", nullable: false), @@ -125,6 +141,11 @@ namespace FlowerShopDatabaseImplement.Migrations principalTable: "Flowers", principalColumn: "Id", onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_Orders_Implementers_ImplementerId", + column: x => x.ImplementerId, + principalTable: "Implementers", + principalColumn: "Id"); }); migrationBuilder.CreateTable( @@ -175,6 +196,7 @@ namespace FlowerShopDatabaseImplement.Migrations column: "FlowerId"); migrationBuilder.CreateIndex( +<<<<<<<< HEAD:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.cs name: "IX_ShopFlowers_FlowerId", table: "ShopFlowers", column: "FlowerId"); @@ -183,6 +205,11 @@ namespace FlowerShopDatabaseImplement.Migrations name: "IX_ShopFlowers_ShopId", table: "ShopFlowers", column: "ShopId"); +======== + name: "IX_Orders_ImplementerId", + table: "Orders", + column: "ImplementerId"); +>>>>>>>> origin/lab6:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.cs } protected override void Down(MigrationBuilder migrationBuilder) @@ -206,7 +233,11 @@ namespace FlowerShopDatabaseImplement.Migrations name: "Flowers"); migrationBuilder.DropTable( +<<<<<<<< HEAD:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240517110214_InitCreate.cs name: "Shops"); +======== + name: "Implementers"); +>>>>>>>> origin/lab6:FlowerShop/FlowerShopDatabaseImplement/Migrations/20240422161656_InitCreate.cs } } } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs b/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs index 682d097..dc3a919 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Migrations/FlowerShopDatabaseModelSnapshot.cs @@ -113,6 +113,33 @@ namespace FlowerShopDatabaseImplement.Migrations b.ToTable("FlowerComponents"); }); + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Implementer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("ImplementerFIO") + .IsRequired() + .HasColumnType("text"); + + b.Property("Password") + .IsRequired() + .HasColumnType("text"); + + b.Property("Qualification") + .HasColumnType("integer"); + + b.Property("WorkExperience") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Implementers"); + }); + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Order", b => { b.Property("Id") @@ -136,6 +163,9 @@ namespace FlowerShopDatabaseImplement.Migrations b.Property("FlowerId") .HasColumnType("integer"); + b.Property("ImplementerId") + .HasColumnType("integer"); + b.Property("Status") .HasColumnType("integer"); @@ -148,62 +178,11 @@ namespace FlowerShopDatabaseImplement.Migrations b.HasIndex("FlowerId"); + b.HasIndex("ImplementerId"); + b.ToTable("Orders"); }); - modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Shop", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Address") - .IsRequired() - .HasColumnType("text"); - - b.Property("DateOpening") - .HasColumnType("timestamp without time zone"); - - b.Property("MaximumFlowers") - .HasColumnType("integer"); - - b.Property("ShopName") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.ToTable("Shops"); - }); - - modelBuilder.Entity("FlowerShopDatabaseImplement.Models.ShopFlower", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("Count") - .HasColumnType("integer"); - - b.Property("FlowerId") - .HasColumnType("integer"); - - b.Property("ShopId") - .HasColumnType("integer"); - - b.HasKey("Id"); - - b.HasIndex("FlowerId"); - - b.HasIndex("ShopId"); - - b.ToTable("ShopFlowers"); - }); - modelBuilder.Entity("FlowerShopDatabaseImplement.Models.FlowerComponent", b => { b.HasOne("FlowerShopDatabaseImplement.Models.Component", "Component") @@ -226,7 +205,7 @@ namespace FlowerShopDatabaseImplement.Migrations modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Order", b => { b.HasOne("FlowerShopDatabaseImplement.Models.Client", "Client") - .WithMany("Orders") + .WithMany() .HasForeignKey("ClientId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -237,33 +216,15 @@ namespace FlowerShopDatabaseImplement.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); + b.HasOne("FlowerShopDatabaseImplement.Models.Implementer", "Implementer") + .WithMany("Order") + .HasForeignKey("ImplementerId"); + b.Navigation("Client"); b.Navigation("Flower"); - }); - modelBuilder.Entity("FlowerShopDatabaseImplement.Models.ShopFlower", b => - { - b.HasOne("FlowerShopDatabaseImplement.Models.Flower", "Flower") - .WithMany() - .HasForeignKey("FlowerId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("FlowerShopDatabaseImplement.Models.Shop", "Shop") - .WithMany("Flowers") - .HasForeignKey("ShopId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Flower"); - - b.Navigation("Shop"); - }); - - modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Client", b => - { - b.Navigation("Orders"); + b.Navigation("Implementer"); }); modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Component", b => @@ -278,9 +239,9 @@ namespace FlowerShopDatabaseImplement.Migrations b.Navigation("Orders"); }); - modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Shop", b => + modelBuilder.Entity("FlowerShopDatabaseImplement.Models.Implementer", b => { - b.Navigation("Flowers"); + b.Navigation("Order"); }); #pragma warning restore 612, 618 } diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs new file mode 100644 index 0000000..98d68f1 --- /dev/null +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Implementer.cs @@ -0,0 +1,56 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.ViewModels; +using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations; +using FlowerShopDataModels.Models; + +namespace FlowerShopDatabaseImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; set; } + [Required] + public string ImplementerFIO { get; set; } = string.Empty; + [Required] + public string Password { get; set; } = string.Empty; + [Required] + public int WorkExperience { get; set; } + [Required] + public int Qualification { get; set; } + [ForeignKey("ImplementerId")] + public virtual List Order { get; set; } = new(); + public static Implementer? Create(ImplementerBindingModel? Model) + { + if (Model == null) + return null; + + return new Implementer() + { + Id = Model.Id, + ImplementerFIO = Model.ImplementerFIO, + Password = Model.Password, + WorkExperience = Model.WorkExperience, + Qualification = Model.Qualification + }; + } + public void Update(ImplementerBindingModel Model) + { + if (Model == null) + { + return; + } + ImplementerFIO = Model.ImplementerFIO; + Password = Model.Password; + WorkExperience = Model.WorkExperience; + Qualification = Model.Qualification; + } + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = Qualification + }; + } +} diff --git a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs index 8d63058..c69e9b9 100644 --- a/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopDatabaseImplement/Models/Order.cs @@ -12,9 +12,13 @@ namespace FlowerShopDatabaseImplement.Models [Required] public int FlowerId { get; private set; } public virtual Flower Flower { get; set; } + public virtual Flower Flower { get; set; } [Required] public int ClientId { get; private set; } public virtual Client Client { get; set; } + public int? ImplementerId { get; private set; } + public virtual Implementer? Implementer { get; set; } + public virtual Client Client { get; set; } [Required] public int Count { get; set; } [Required] @@ -35,6 +39,7 @@ namespace FlowerShopDatabaseImplement.Models Id = model.Id, FlowerId = model.FlowerId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -48,6 +53,7 @@ namespace FlowerShopDatabaseImplement.Models { return; } + ImplementerId = model.ImplementerId; Status = model.Status; DateImplement = model.DateImplement; } @@ -56,6 +62,10 @@ namespace FlowerShopDatabaseImplement.Models Id = Id, FlowerId = FlowerId, ClientId = ClientId, + ImplementerId = ImplementerId, + FlowerName = Flower.FlowerName, + ClientFIO = Client.ClientFIO, + ImplementerFIO = Implementer?.ImplementerFIO, Count = Count, Sum = Sum, Status = Status, diff --git a/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs b/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs index 00e938b..99583be 100644 --- a/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs +++ b/FlowerShop/FlowerShopFileImplement/DataFileSingleton.cs @@ -10,11 +10,13 @@ namespace FlowerShopFileImplement private readonly string OrderFileName = "Order.xml"; private readonly string FlowerFileName = "Flower.xml"; private readonly string ClientFileName = "Client.xml"; + private readonly string ImplementerFileName = "Implementer.xml"; private readonly string ShopFileName = "Shop.xml"; public List Components { get; private set; } public List Orders { get; private set; } public List Flowers { get; private set; } public List Clients { get; private set; } + public List Implementers { get; private set; } public List Shops { get; private set; } public static DataFileSingleton GetInstance() { @@ -28,6 +30,7 @@ namespace FlowerShopFileImplement public void SaveFlowers() => SaveData(Flowers, FlowerFileName, "Flowers", x => x.GetXElement); public void SaveOrders() => SaveData(Orders, OrderFileName, "Orders", x => x.GetXElement); public void SaveClients() => SaveData(Clients, ClientFileName, "Clients", x => x.GetXElement); + public void SaveImplementers() => SaveData(Implementers, ImplementerFileName, "Implementers", x => x.GetXElement); public void SaveShops() => SaveData(Shops, ShopFileName, "Shops", x => x.GetXElement); private DataFileSingleton() { @@ -35,6 +38,7 @@ namespace FlowerShopFileImplement Flowers = LoadData(FlowerFileName, "Flower", x => Flower.Create(x)!)!; Orders = LoadData(OrderFileName, "Order", x => Order.Create(x)!)!; Clients = LoadData(ClientFileName, "Client", x => Client.Create(x)!)!; + Implementers = LoadData(ImplementerFileName, "Implementer", x => Implementer.Create(x)!)!; Shops = LoadData(ShopFileName, "Shop", x => Shop.Create(x)!)!; } private static List? LoadData(string filename, string xmlNodeName, Func selectFunction) diff --git a/FlowerShop/FlowerShopFileImplement/Implements/ImplementerStorage.cs b/FlowerShop/FlowerShopFileImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..02ff35c --- /dev/null +++ b/FlowerShop/FlowerShopFileImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,97 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using FlowerShopFileImplement.Models; + +namespace FlowerShopFileImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + private readonly DataFileSingleton _source; + + public ImplementerStorage() + { + _source = DataFileSingleton.GetInstance(); + } + + public List GetFullList() + { + return _source.Implementers.Select(x => x.GetViewModel).ToList(); + } + + public List GetFilteredList(ImplementerSearchModel Model) + { + if (Model == null) + return new(); + + if (Model.Id.HasValue) + { + var Res = GetElement(Model); + return Res != null ? new() { Res } : new(); + } + + if (Model.ImplementerFIO != null) + { + return _source.Implementers + .Where(x => x.ImplementerFIO.Equals(Model.ImplementerFIO)) + .Select(x => x.GetViewModel) + .ToList(); + } + + return new(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + if (model.Id.HasValue) + return _source.Implementers.FirstOrDefault(x => x.Id == model.Id)?.GetViewModel; + + if (model.ImplementerFIO != null && model.Password != null) + return _source.Implementers.FirstOrDefault(x => x.ImplementerFIO.Equals(model.ImplementerFIO) && x.Password.Equals(model.Password))?.GetViewModel; + + if (model.ImplementerFIO != null) + return _source.Implementers.FirstOrDefault(x => x.ImplementerFIO.Equals(model.ImplementerFIO))?.GetViewModel; + + return null; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + model.Id = _source.Implementers.Count > 0 ? _source.Implementers.Max(x => x.Id) + 1 : 1; + + var Res = Implementer.Create(model); + if (Res != null) + { + _source.Implementers.Add(Res); + _source.SaveImplementers(); + } + + return Res?.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + var Res = _source.Implementers.FirstOrDefault(x => x.Id == model.Id); + if (Res != null) + { + Res.Update(model); + _source.SaveImplementers(); + } + + return Res?.GetViewModel; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + var Res = _source.Implementers.FirstOrDefault(x => x.Id == model.Id); + if (Res != null) + { + _source.Implementers.Remove(Res); + _source.SaveImplementers(); + } + + return Res?.GetViewModel; + } + } +} diff --git a/FlowerShop/FlowerShopFileImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopFileImplement/Implements/OrderStorage.cs index ff602a5..23ac5dc 100644 --- a/FlowerShop/FlowerShopFileImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopFileImplement/Implements/OrderStorage.cs @@ -22,12 +22,16 @@ namespace FlowerShopFileImplement.Implements if (model.DateFrom.HasValue) { return source.Orders - .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) && (!model.ClientId.HasValue || x.ClientId == model.ClientId)) + .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) + && (!model.ClientId.HasValue || x.ClientId == model.ClientId) + && (!model.ImplementerId.HasValue || x.ImplementerId == model.ImplementerId)) .Select(GetViewModel) .ToList(); } return source.Orders - .Where(x => (model.Id.HasValue && x.Id == model.Id) || (model.ClientId.HasValue && x.ClientId == model.ClientId)) + .Where(x => (model.Id.HasValue && x.Id == model.Id) + || (model.ClientId.HasValue && x.ClientId == model.ClientId) + || (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId)) .Select(GetViewModel) .ToList(); } diff --git a/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs b/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs new file mode 100644 index 0000000..290e43a --- /dev/null +++ b/FlowerShop/FlowerShopFileImplement/Models/Implementer.cs @@ -0,0 +1,70 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Models; +using System.Xml.Linq; + +namespace FlowerShopFileImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + public string ImplementerFIO { get; private set; } = string.Empty; + public string Password { get; private set; } = string.Empty; + public int WorkExperience { get; private set; } + public int Qualification { get; private set; } + public static Implementer? Create(ImplementerBindingModel Model) + { + if (Model == null) + return null; + + return new() + { + Id = Model.Id, + ImplementerFIO = Model.ImplementerFIO, + Password = Model.Password, + WorkExperience = Model.WorkExperience, + Qualification = Model.Qualification, + }; + } + public static Implementer? Create(XElement Element) + { + if (Element == null) + return null; + + return new() + { + Id = Convert.ToInt32(Element.Attribute("Id")!.Value), + ImplementerFIO = Element.Element("ImplementerFIO")!.Value, + Password = Element.Element("Password")!.Value, + WorkExperience = Convert.ToInt32(Element.Element("WorkExperience")!.Value), + Qualification = Convert.ToInt32(Element.Element("Qualification")!.Value), + }; + } + public void Update(ImplementerBindingModel Model) + { + if (Model == null) + return; + + ImplementerFIO = Model.ImplementerFIO; + Password = Model.Password; + WorkExperience = Model.WorkExperience; + Qualification = Model.Qualification; + } + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = Qualification, + }; + public XElement GetXElement => new( + "Implementer", + new XAttribute("Id", Id), + new XElement("ImplementerFIO", ImplementerFIO), + new XElement("Password", Password), + new XElement("WorkExperience", WorkExperience), + new XElement("Qualification", Qualification) + ); + } +} diff --git a/FlowerShop/FlowerShopFileImplement/Models/Order.cs b/FlowerShop/FlowerShopFileImplement/Models/Order.cs index 3661227..594dec8 100644 --- a/FlowerShop/FlowerShopFileImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopFileImplement/Models/Order.cs @@ -11,6 +11,7 @@ namespace FlowerShopFileImplement.Models public int Id { get; private set; } public int FlowerId { get; private set; } public int ClientId { get; private set; } + public int? ImplementerId { get; private set; } public int Count { get; private set; } public double Sum { get; set; } public OrderStatus Status { get; set; } @@ -27,6 +28,7 @@ namespace FlowerShopFileImplement.Models Id = model.Id, FlowerId = model.FlowerId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -45,6 +47,7 @@ namespace FlowerShopFileImplement.Models Id = Convert.ToInt32(element.Attribute("Id")!.Value), FlowerId = Convert.ToInt32(element.Element("FlowerId")!.Value), ClientId = Convert.ToInt32(element.Element("ClientId")!.Value), + ImplementerId = Convert.ToInt32(element.Element("ImplementerId")!.Value), Count = Convert.ToInt32(element.Element("Count")!.Value), Sum = Convert.ToDouble(element.Element("Sum")!.Value), Status = (OrderStatus) Enum.Parse(typeof(OrderStatus), element.Element("Status")!.Value), @@ -61,6 +64,7 @@ namespace FlowerShopFileImplement.Models Id = model.Id; FlowerId = model.FlowerId; ClientId = model.ClientId; + ImplementerId = model.ImplementerId; Count = model.Count; Sum = model.Sum; Status = model.Status; @@ -72,6 +76,7 @@ namespace FlowerShopFileImplement.Models Id = Id, FlowerId = FlowerId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, @@ -83,7 +88,8 @@ namespace FlowerShopFileImplement.Models new XAttribute("Id", Id), new XElement("FlowerId", FlowerId.ToString()), new XElement("ClientId", ClientId.ToString()), - new XElement("Count", Count.ToString()), + new XElement("ImplementerId", ImplementerId.ToString()), + new XElement("Count", Count.ToString()), new XElement("Sum", Sum.ToString()), new XElement("Status", Status.ToString()), new XElement("DateCreate", DateCreate.ToString()), diff --git a/FlowerShop/FlowerShopListImplement/DataListSingleton.cs b/FlowerShop/FlowerShopListImplement/DataListSingleton.cs index fe0eb7a..a389b8f 100644 --- a/FlowerShop/FlowerShopListImplement/DataListSingleton.cs +++ b/FlowerShop/FlowerShopListImplement/DataListSingleton.cs @@ -9,6 +9,7 @@ namespace FlowerShopListImplement public List Orders { get; set; } public List Flowers { get; set; } public List Clients { get; set; } + public List Implementers { get; set; } public List Shops { get; set; } private DataListSingleton() { @@ -16,6 +17,7 @@ namespace FlowerShopListImplement Orders = new List(); Flowers = new List(); Clients = new List(); + Implementers = new List(); Shops = new List(); } public static DataListSingleton GetInstance() diff --git a/FlowerShop/FlowerShopListImplement/Implements/ImplementerStorage.cs b/FlowerShop/FlowerShopListImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..9ef72c3 --- /dev/null +++ b/FlowerShop/FlowerShopListImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,104 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.StoragesContracts; +using FlowerShopContracts.ViewModels; +using FlowerShopListImplement.Models; + +namespace FlowerShopListImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + private readonly DataListSingleton _source; + + public ImplementerStorage() + { + _source = DataListSingleton.GetInstance(); + } + + public List GetFullList() + { + var Result = new List(); + + foreach (var Implementer in _source.Implementers) + { + Result.Add(Implementer.GetViewModel); + } + + return Result; + } + + public List GetFilteredList(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO)) + return new(); + + return _source.Implementers + .Where(x => (!string.IsNullOrEmpty(model.ImplementerFIO) && x.ImplementerFIO.Contains(model.ImplementerFIO))) + .Select(x => x.GetViewModel) + .ToList(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + foreach (var Implementer in _source.Implementers) + { + if ((model.Id.HasValue && Implementer.Id == model.Id) || + (!string.IsNullOrEmpty(model.ImplementerFIO) && Implementer.ImplementerFIO == model.ImplementerFIO)) + { + return Implementer.GetViewModel; + } + } + + return null; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + model.Id = 1; + foreach (var Implementer in _source.Implementers) + { + if (model.Id <= Implementer.Id) + { + model.Id = Implementer.Id + 1; + } + } + + var NewImplementer = Implementer.Create(model); + if (NewImplementer == null) + return null; + + _source.Implementers.Add(NewImplementer); + return NewImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + foreach (var Implementer in _source.Implementers) + { + if (Implementer.Id == model.Id) + { + Implementer.Update(model); + return Implementer.GetViewModel; + } + } + + return null; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + for (int i = 0; i < _source.Implementers.Count; ++i) + { + if (_source.Implementers[i].Id == model.Id) + { + var Implementer = _source.Implementers[i]; + _source.Implementers.RemoveAt(i); + + return Implementer.GetViewModel; + } + } + + return null; + } + } +} diff --git a/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs b/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs index 86bbf74..7a0f2e9 100644 --- a/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs +++ b/FlowerShop/FlowerShopListImplement/Implements/OrderStorage.cs @@ -28,12 +28,16 @@ namespace FlowerShopListImplement.Implements if (model.DateFrom.HasValue) { return _source.Orders - .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) && (!model.ClientId.HasValue || x.ClientId == model.ClientId)) + .Where(x => (x.DateCreate >= model.DateFrom && x.DateCreate <= model.DateTo) + && (!model.ClientId.HasValue || x.ClientId == model.ClientId) + && (!model.ImplementerId.HasValue || x.ImplementerId == model.ImplementerId)) .Select(x => AttachNames(x.GetViewModel)) .ToList(); } return _source.Orders - .Where(x => (model.Id.HasValue && x.Id == model.Id) || (model.ClientId.HasValue && x.ClientId == model.ClientId)) + .Where(x => (model.Id.HasValue && x.Id == model.Id) + || (model.ClientId.HasValue && x.ClientId == model.ClientId) + || (model.ImplementerId.HasValue && x.ImplementerId == model.ImplementerId)) .Select(x => AttachNames(x.GetViewModel)) .ToList(); } diff --git a/FlowerShop/FlowerShopListImplement/Models/Implementer.cs b/FlowerShop/FlowerShopListImplement/Models/Implementer.cs new file mode 100644 index 0000000..25e8d9c --- /dev/null +++ b/FlowerShop/FlowerShopListImplement/Models/Implementer.cs @@ -0,0 +1,49 @@ +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Models; + +namespace FlowerShopListImplement.Models +{ + public class Implementer : IImplementerModel + { + public int Id { get; private set; } + public string ImplementerFIO { get; private set; } + public string Password { get; private set; } + public int WorkExperience { get; private set; } + public int Qualification { get; private set; } + public static Implementer? Create(ImplementerBindingModel? model) + { + if (model == null) + { + return null; + } + return new Implementer() + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + Password = model.Password, + WorkExperience = model.WorkExperience, + Qualification = model.Qualification, + }; + } + public void Update(ImplementerBindingModel? model) + { + if (model == null) + { + return; + } + ImplementerFIO = model.ImplementerFIO; + Password = model.Password; + WorkExperience = model.WorkExperience; + Qualification = model.Qualification; + } + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + Password = Password, + WorkExperience = WorkExperience, + Qualification = Qualification, + }; + } +} diff --git a/FlowerShop/FlowerShopListImplement/Models/Order.cs b/FlowerShop/FlowerShopListImplement/Models/Order.cs index cff9cf2..d36c7d6 100644 --- a/FlowerShop/FlowerShopListImplement/Models/Order.cs +++ b/FlowerShop/FlowerShopListImplement/Models/Order.cs @@ -10,6 +10,7 @@ namespace FlowerShopListImplement.Models public int Id { get; private set; } public int FlowerId { get; private set; } public int ClientId { get; private set; } + public int? ImplementerId { get; private set; } public int Count { get; set; } public double Sum { get; private set; } public OrderStatus Status { get; set; } @@ -26,6 +27,7 @@ namespace FlowerShopListImplement.Models Id = model.Id, FlowerId = model.FlowerId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -42,6 +44,7 @@ namespace FlowerShopListImplement.Models Id = model.Id; FlowerId = model.FlowerId; ClientId = model.ClientId; + ImplementerId = model.ImplementerId; Count = model.Count; Sum = model.Sum; Status = model.Status; @@ -53,6 +56,7 @@ namespace FlowerShopListImplement.Models Id = Id, FlowerId = FlowerId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, diff --git a/FlowerShop/FlowerShopRestApi/Controllers/ImplementerController.cs b/FlowerShop/FlowerShopRestApi/Controllers/ImplementerController.cs new file mode 100644 index 0000000..a2fd78d --- /dev/null +++ b/FlowerShop/FlowerShopRestApi/Controllers/ImplementerController.cs @@ -0,0 +1,100 @@ +using DocumentFormat.OpenXml.Office2010.Excel; +using FlowerShopContracts.BindingModels; +using FlowerShopContracts.BusinessLogicsContracts; +using FlowerShopContracts.SearchModels; +using FlowerShopContracts.ViewModels; +using FlowerShopDataModels.Enums; +using Microsoft.AspNetCore.Mvc; + +namespace FlowerShopRestApi.Controllers +{ + [Route("api/[controller]/[action]")] + [ApiController] + public class ImplementerController : Controller + { + private readonly ILogger _logger; + private readonly IOrderLogic _order; + private readonly IImplementerLogic _logic; + public ImplementerController(IOrderLogic order, IImplementerLogic logic, ILogger logger) + { + _logger = logger; + _order = order; + _logic = logic; + } + [HttpGet] + public ImplementerViewModel? Login(string login, string password) + { + try + { + return _logic.ReadElement(new ImplementerSearchModel + { + ImplementerFIO = login, + Password = password + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка авторизации сотрудника"); + throw; + } + } + [HttpGet] + public List? GetNewOrders() + { + try + { + return _order.ReadList(new OrderSearchModel + { + Status = OrderStatus.Принят + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения новых заказов"); + throw; + } + } + [HttpGet] + public OrderViewModel? GetImplementerOrder(int implementerId) + { + try + { + return _order.ReadElement(new OrderSearchModel + { + ImplementerId = implementerId + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения текущего заказа исполнителя"); + throw; + } + } + [HttpPost] + public void TakeOrderInWork(OrderBindingModel model) + { + try + { + _order.TakeOrderInWork(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка перевода заказа с №{Id} в работу", model.Id); + throw; + } + } + [HttpPost] + public void FinishOrder(OrderBindingModel model) + { + try + { + _order.FinishOrder(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа с №{ Id}", model.Id); + throw; + } + } + } +} \ No newline at end of file