diff --git a/Secure/SecureShop/FormImplementer.Designer.cs b/Secure/SecureShop/FormImplementer.Designer.cs new file mode 100644 index 0000000..e43a8a5 --- /dev/null +++ b/Secure/SecureShop/FormImplementer.Designer.cs @@ -0,0 +1,169 @@ +namespace SecureShopView +{ + 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() + { + labelName = new Label(); + labelWorkExperience = new Label(); + textBoxName = new TextBox(); + textBoxWorkExperience = new TextBox(); + buttonSave = new Button(); + buttonCancel = new Button(); + textBoxPassword = new TextBox(); + labelPassword = new Label(); + textBoxQualification = new TextBox(); + labelQualification = new Label(); + SuspendLayout(); + // + // labelName + // + labelName.AutoSize = true; + labelName.Location = new Point(27, 14); + labelName.Name = "labelName"; + labelName.Size = new Size(37, 15); + labelName.TabIndex = 0; + labelName.Text = "ФИО:"; + // + // labelWorkExperience + // + labelWorkExperience.AutoSize = true; + labelWorkExperience.Location = new Point(27, 73); + labelWorkExperience.Name = "labelWorkExperience"; + labelWorkExperience.Size = new Size(82, 15); + labelWorkExperience.TabIndex = 1; + labelWorkExperience.Text = "Стаж работы:"; + // + // textBoxName + // + textBoxName.Location = new Point(127, 12); + textBoxName.Margin = new Padding(3, 2, 3, 2); + textBoxName.Name = "textBoxName"; + textBoxName.Size = new Size(263, 23); + textBoxName.TabIndex = 2; + // + // textBoxWorkExperience + // + textBoxWorkExperience.Location = new Point(127, 70); + textBoxWorkExperience.Margin = new Padding(3, 2, 3, 2); + textBoxWorkExperience.Name = "textBoxWorkExperience"; + textBoxWorkExperience.Size = new Size(82, 23); + textBoxWorkExperience.TabIndex = 3; + // + // buttonSave + // + buttonSave.Location = new Point(127, 116); + buttonSave.Margin = new Padding(3, 2, 3, 2); + buttonSave.Name = "buttonSave"; + buttonSave.Size = new Size(82, 22); + buttonSave.TabIndex = 4; + buttonSave.Text = "Сохранить"; + buttonSave.UseVisualStyleBackColor = true; + buttonSave.Click += ButtonSave_Click; + // + // buttonCancel + // + buttonCancel.Location = new Point(254, 116); + buttonCancel.Margin = new Padding(3, 2, 3, 2); + buttonCancel.Name = "buttonCancel"; + buttonCancel.Size = new Size(82, 22); + buttonCancel.TabIndex = 5; + buttonCancel.Text = "Отмена"; + buttonCancel.UseVisualStyleBackColor = true; + buttonCancel.Click += ButtonCancel_Click; + // + // textBoxPassword + // + textBoxPassword.Location = new Point(127, 43); + textBoxPassword.Margin = new Padding(3, 2, 3, 2); + textBoxPassword.Name = "textBoxPassword"; + textBoxPassword.Size = new Size(263, 23); + textBoxPassword.TabIndex = 7; + // + // labelPassword + // + labelPassword.AutoSize = true; + labelPassword.Location = new Point(27, 45); + labelPassword.Name = "labelPassword"; + labelPassword.Size = new Size(37, 15); + labelPassword.TabIndex = 6; + labelPassword.Text = "ФИО:"; + // + // textBoxQualification + // + textBoxQualification.Location = new Point(322, 73); + textBoxQualification.Margin = new Padding(3, 2, 3, 2); + textBoxQualification.Name = "textBoxQualification"; + textBoxQualification.Size = new Size(68, 23); + textBoxQualification.TabIndex = 9; + // + // labelQualification + // + labelQualification.AutoSize = true; + labelQualification.Location = new Point(222, 76); + labelQualification.Name = "labelQualification"; + labelQualification.Size = new Size(91, 15); + labelQualification.TabIndex = 8; + labelQualification.Text = "Квалификация:"; + // + // FormImplementer + // + AutoScaleDimensions = new SizeF(7F, 15F); + AutoScaleMode = AutoScaleMode.Font; + ClientSize = new Size(400, 155); + Controls.Add(textBoxQualification); + Controls.Add(labelQualification); + Controls.Add(textBoxPassword); + Controls.Add(labelPassword); + Controls.Add(buttonCancel); + Controls.Add(buttonSave); + Controls.Add(textBoxWorkExperience); + Controls.Add(textBoxName); + Controls.Add(labelWorkExperience); + Controls.Add(labelName); + Margin = new Padding(3, 2, 3, 2); + Name = "FormImplementer"; + Text = "Исполнитель"; + Load += FormImplementer_Load; + ResumeLayout(false); + PerformLayout(); + } + + #endregion + + private Label labelName; + private Label labelWorkExperience; + private TextBox textBoxName; + private TextBox textBoxWorkExperience; + private Button buttonSave; + private Button buttonCancel; + private TextBox textBoxPassword; + private Label labelPassword; + private TextBox textBoxQualification; + private Label labelQualification; + } +} \ No newline at end of file diff --git a/Secure/SecureShop/FormImplementer.cs b/Secure/SecureShop/FormImplementer.cs new file mode 100644 index 0000000..8b0238c --- /dev/null +++ b/Secure/SecureShop/FormImplementer.cs @@ -0,0 +1,104 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.BusinessLogicsContracts; +using SecureShopContracts.SearchModels; +using Microsoft.Extensions.Logging; + +namespace SecureShopView +{ + 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) + { + textBoxName.Text = view.ImplementerFIO; + + } + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка получения исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + + private void ButtonSave_Click(object sender, EventArgs e) + { + if (string.IsNullOrEmpty(textBoxName.Text)) + { + MessageBox.Show("Заполните ФИО", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxPassword.Text)) + { + MessageBox.Show("Заполните пароль", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxQualification.Text)) + { + MessageBox.Show("Заполните квалификацию", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + if (string.IsNullOrEmpty(textBoxWorkExperience.Text)) + { + MessageBox.Show("Заполните опыт работы", "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + return; + } + _logger.LogInformation("Сохранение "); + try + { + var model = new ImplementerBindingModel + { + Id = _id ?? 0, + ImplementerFIO = textBoxName.Text, + Password = textBoxPassword.Text, + Qualification = int.Parse(textBoxQualification.Text), + WorkExperience = int.Parse(textBoxWorkExperience.Text) + + }; + var operationResult = _id.HasValue ? _logic.Update(model) : _logic.Create(model); + if (!operationResult) + { + throw new Exception("Ошибка при сохранении. Дополнительная информация в логах."); + } + MessageBox.Show("Сохранение прошло успешно", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + DialogResult = DialogResult.OK; + Close(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка сохранения добавки"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, + MessageBoxIcon.Error); + } + } + + private void ButtonCancel_Click(object sender, EventArgs e) + { + DialogResult = DialogResult.Cancel; + Close(); + } + } +} \ No newline at end of file diff --git a/Secure/SecureShop/FormImplementer.resx b/Secure/SecureShop/FormImplementer.resx new file mode 100644 index 0000000..f298a7b --- /dev/null +++ b/Secure/SecureShop/FormImplementer.resx @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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/Secure/SecureShop/FormImplementers.Designer.cs b/Secure/SecureShop/FormImplementers.Designer.cs new file mode 100644 index 0000000..fa49e6c --- /dev/null +++ b/Secure/SecureShop/FormImplementers.Designer.cs @@ -0,0 +1,121 @@ +namespace SecureShopView +{ + 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() + { + this.dataGridView = new System.Windows.Forms.DataGridView(); + this.buttonAdd = new System.Windows.Forms.Button(); + this.buttonUpd = new System.Windows.Forms.Button(); + this.buttonDel = new System.Windows.Forms.Button(); + this.buttonRef = new System.Windows.Forms.Button(); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).BeginInit(); + this.SuspendLayout(); + // + // dataGridView + // + this.dataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize; + this.dataGridView.Location = new System.Drawing.Point(10, 9); + this.dataGridView.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.dataGridView.Name = "dataGridView"; + this.dataGridView.RowHeadersWidth = 51; + this.dataGridView.RowTemplate.Height = 29; + this.dataGridView.Size = new System.Drawing.Size(444, 320); + this.dataGridView.TabIndex = 0; + // + // buttonAdd + // + this.buttonAdd.Location = new System.Drawing.Point(471, 9); + this.buttonAdd.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.buttonAdd.Name = "buttonAdd"; + this.buttonAdd.Size = new System.Drawing.Size(133, 22); + this.buttonAdd.TabIndex = 1; + this.buttonAdd.Text = "Добавить"; + this.buttonAdd.UseVisualStyleBackColor = true; + this.buttonAdd.Click += new System.EventHandler(this.ButtonAdd_Click); + // + // buttonUpd + // + this.buttonUpd.Location = new System.Drawing.Point(471, 35); + this.buttonUpd.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.buttonUpd.Name = "buttonUpd"; + this.buttonUpd.Size = new System.Drawing.Size(133, 22); + this.buttonUpd.TabIndex = 2; + this.buttonUpd.Text = "Изменить"; + this.buttonUpd.UseVisualStyleBackColor = true; + this.buttonUpd.Click += new System.EventHandler(this.ButtonUpd_Click); + // + // buttonDel + // + this.buttonDel.Location = new System.Drawing.Point(471, 62); + this.buttonDel.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.buttonDel.Name = "buttonDel"; + this.buttonDel.Size = new System.Drawing.Size(133, 22); + this.buttonDel.TabIndex = 3; + this.buttonDel.Text = "Удалить"; + this.buttonDel.UseVisualStyleBackColor = true; + this.buttonDel.Click += new System.EventHandler(this.ButtonDel_Click); + // + // buttonRef + // + this.buttonRef.Location = new System.Drawing.Point(471, 88); + this.buttonRef.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.buttonRef.Name = "buttonRef"; + this.buttonRef.Size = new System.Drawing.Size(133, 22); + this.buttonRef.TabIndex = 4; + this.buttonRef.Text = "Обновить"; + this.buttonRef.UseVisualStyleBackColor = true; + this.buttonRef.Click += new System.EventHandler(this.ButtonRef_Click); + // + // FormImplementers + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.ClientSize = new System.Drawing.Size(614, 338); + this.Controls.Add(this.buttonRef); + this.Controls.Add(this.buttonDel); + this.Controls.Add(this.buttonUpd); + this.Controls.Add(this.buttonAdd); + this.Controls.Add(this.dataGridView); + this.Margin = new System.Windows.Forms.Padding(3, 2, 3, 2); + this.Name = "FormImplementers"; + this.Text = "Исполнители"; + this.Load += new System.EventHandler(this.FormImplementers_Load); + ((System.ComponentModel.ISupportInitialize)(this.dataGridView)).EndInit(); + this.ResumeLayout(false); + + } + + #endregion + + private DataGridView dataGridView; + private Button buttonAdd; + private Button buttonUpd; + private Button buttonDel; + private Button buttonRef; + } +} \ No newline at end of file diff --git a/Secure/SecureShop/FormImplementers.cs b/Secure/SecureShop/FormImplementers.cs new file mode 100644 index 0000000..de2dfee --- /dev/null +++ b/Secure/SecureShop/FormImplementers.cs @@ -0,0 +1,105 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.BusinessLogicsContracts; +using Microsoft.Extensions.Logging; + +namespace SecureShopView +{ + public partial class FormImplementers : Form + { + private readonly ILogger _logger; + private readonly IImplementerLogic _logic; + + public FormImplementers(ILogger logger, IImplementerLogic logic) + { + InitializeComponent(); + _logger = logger; + _logic = logic; + } + + private void FormImplementers_Load(object sender, EventArgs e) + { + LoadData(); + } + + private void LoadData() + { + try + { + var list = _logic.ReadList(null); + if (list != null) + { + dataGridView.DataSource = list; + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["ImplementerFIO"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; + } + _logger.LogInformation("Загрузка исполнителей"); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка загрузки исполнителей"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + + private void ButtonAdd_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + if (service is FormImplementer form) + { + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + + private void ButtonUpd_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementer)); + if (service is FormImplementer form) + { + form.Id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + if (form.ShowDialog() == DialogResult.OK) + { + LoadData(); + } + } + } + } + + private void ButtonDel_Click(object sender, EventArgs e) + { + if (dataGridView.SelectedRows.Count == 1) + { + if (MessageBox.Show("Удалить запись?", "Вопрос", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) + { + int id = Convert.ToInt32(dataGridView.SelectedRows[0].Cells["Id"].Value); + _logger.LogInformation("Удаление исполнителя"); + try + { + if (!_logic.Delete(new ImplementerBindingModel + { + Id = id + })) + { + throw new Exception("Ошибка при удалении. Дополнительная информация в логах."); + } + LoadData(); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка удаления исполнителя"); + MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error); + } + } + } + } + + private void ButtonRef_Click(object sender, EventArgs e) + { + LoadData(); + } + } +} diff --git a/Secure/SecureShop/FormImplementers.resx b/Secure/SecureShop/FormImplementers.resx new file mode 100644 index 0000000..1af7de1 --- /dev/null +++ b/Secure/SecureShop/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/Secure/SecureShop/FormMain.Designer.cs b/Secure/SecureShop/FormMain.Designer.cs index 0d686c7..1473cf4 100644 --- a/Secure/SecureShop/FormMain.Designer.cs +++ b/Secure/SecureShop/FormMain.Designer.cs @@ -30,13 +30,15 @@ { menuStrip = new MenuStrip(); справочникиToolStripMenuItem = new ToolStripMenuItem(); - FacilitiesToolStripMenuItem = new ToolStripMenuItem(); + FacilitiessToolStripMenuItem = new ToolStripMenuItem(); SecuresToolStripMenuItem = new ToolStripMenuItem(); ClientsToolStripMenuItem = new ToolStripMenuItem(); + ImplementersToolStripMenuItem = new ToolStripMenuItem(); отчётыToolStripMenuItem = new ToolStripMenuItem(); SecuresReportToolStripMenuItem = new ToolStripMenuItem(); - SecureFacilitiesReportToolStripMenuItem = new ToolStripMenuItem(); + SecureFacilitiessReportToolStripMenuItem = new ToolStripMenuItem(); OrdersReportToolStripMenuItem = new ToolStripMenuItem(); + StartWorkingToolStripMenuItem = new ToolStripMenuItem(); dataGridView = new DataGridView(); buttonCreateOrder = new Button(); buttonTakeOrderInWork = new Button(); @@ -50,45 +52,52 @@ // menuStrip // menuStrip.ImageScalingSize = new Size(20, 20); - menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem }); + menuStrip.Items.AddRange(new ToolStripItem[] { справочникиToolStripMenuItem, отчётыToolStripMenuItem, StartWorkingToolStripMenuItem }); menuStrip.Location = new Point(0, 0); menuStrip.Name = "menuStrip"; menuStrip.Padding = new Padding(5, 2, 0, 2); - menuStrip.Size = new Size(997, 24); + menuStrip.Size = new Size(1149, 24); menuStrip.TabIndex = 0; menuStrip.Text = "Справочники"; // // справочникиToolStripMenuItem // - справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { FacilitiesToolStripMenuItem, SecuresToolStripMenuItem, ClientsToolStripMenuItem }); + справочникиToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { FacilitiessToolStripMenuItem, SecuresToolStripMenuItem, ClientsToolStripMenuItem, ImplementersToolStripMenuItem }); справочникиToolStripMenuItem.Name = "справочникиToolStripMenuItem"; справочникиToolStripMenuItem.Size = new Size(94, 20); справочникиToolStripMenuItem.Text = "Справочники"; // - // FacilitiesToolStripMenuItem + // FacilitiessToolStripMenuItem // - FacilitiesToolStripMenuItem.Name = "FacilitiesToolStripMenuItem"; - FacilitiesToolStripMenuItem.Size = new Size(203, 22); - FacilitiesToolStripMenuItem.Text = "Оборудование"; - FacilitiesToolStripMenuItem.Click += FacilitiesToolStripMenuItem_Click; + FacilitiessToolStripMenuItem.Name = "FacilitiessToolStripMenuItem"; + FacilitiessToolStripMenuItem.Size = new Size(200, 22); + FacilitiessToolStripMenuItem.Text = "Оборудование"; + FacilitiessToolStripMenuItem.Click += FacilitiessToolStripMenuItem_Click; // // SecuresToolStripMenuItem // SecuresToolStripMenuItem.Name = "SecuresToolStripMenuItem"; - SecuresToolStripMenuItem.Size = new Size(203, 22); - SecuresToolStripMenuItem.Text = "Системы безопасности"; + SecuresToolStripMenuItem.Size = new Size(200, 22); + SecuresToolStripMenuItem.Text = "Система безопасности"; SecuresToolStripMenuItem.Click += SecuresToolStripMenuItem_Click; // // ClientsToolStripMenuItem // ClientsToolStripMenuItem.Name = "ClientsToolStripMenuItem"; - ClientsToolStripMenuItem.Size = new Size(203, 22); + ClientsToolStripMenuItem.Size = new Size(200, 22); ClientsToolStripMenuItem.Text = "Клиенты"; ClientsToolStripMenuItem.Click += ClientsToolStripMenuItem_Click; // + // ImplementersToolStripMenuItem + // + ImplementersToolStripMenuItem.Name = "ImplementersToolStripMenuItem"; + ImplementersToolStripMenuItem.Size = new Size(200, 22); + ImplementersToolStripMenuItem.Text = "Исполнители"; + ImplementersToolStripMenuItem.Click += ImplementersToolStripMenuItem_Click; + // // отчётыToolStripMenuItem // - отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { SecuresReportToolStripMenuItem, SecureFacilitiesReportToolStripMenuItem, OrdersReportToolStripMenuItem }); + отчётыToolStripMenuItem.DropDownItems.AddRange(new ToolStripItem[] { SecuresReportToolStripMenuItem, SecureFacilitiessReportToolStripMenuItem, OrdersReportToolStripMenuItem }); отчётыToolStripMenuItem.Name = "отчётыToolStripMenuItem"; отчётыToolStripMenuItem.Size = new Size(60, 20); отчётыToolStripMenuItem.Text = "Отчёты"; @@ -100,12 +109,12 @@ SecuresReportToolStripMenuItem.Text = "Список систем безопасности"; SecuresReportToolStripMenuItem.Click += SecuresReportToolStripMenuItem_Click; // - // SecureFacilitiesReportToolStripMenuItem + // SecureFacilitiessReportToolStripMenuItem // - SecureFacilitiesReportToolStripMenuItem.Name = "SecureFacilitiesReportToolStripMenuItem"; - SecureFacilitiesReportToolStripMenuItem.Size = new Size(236, 22); - SecureFacilitiesReportToolStripMenuItem.Text = "Оборудование по СБ"; - SecureFacilitiesReportToolStripMenuItem.Click += SecureFacilitiesReportToolStripMenuItem_Click; + SecureFacilitiessReportToolStripMenuItem.Name = "SecureFacilitiessReportToolStripMenuItem"; + SecureFacilitiessReportToolStripMenuItem.Size = new Size(236, 22); + SecureFacilitiessReportToolStripMenuItem.Text = "Оборудование по СБ"; + SecureFacilitiessReportToolStripMenuItem.Click += SecureFacilitiessReportToolStripMenuItem_Click; // // OrdersReportToolStripMenuItem // @@ -114,20 +123,27 @@ OrdersReportToolStripMenuItem.Text = "Список заказов"; OrdersReportToolStripMenuItem.Click += OrdersReportToolStripMenuItem_Click; // + // StartWorkingToolStripMenuItem + // + StartWorkingToolStripMenuItem.Name = "StartWorkingToolStripMenuItem"; + StartWorkingToolStripMenuItem.Size = new Size(92, 20); + StartWorkingToolStripMenuItem.Text = "Запуск работ"; + StartWorkingToolStripMenuItem.Click += StartWorkingToolStripMenuItem_Click; + // // dataGridView // dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; - dataGridView.Location = new Point(10, 23); + dataGridView.Location = new Point(12, 26); dataGridView.Margin = new Padding(3, 2, 3, 2); dataGridView.Name = "dataGridView"; dataGridView.RowHeadersWidth = 51; dataGridView.RowTemplate.Height = 29; - dataGridView.Size = new Size(801, 305); + dataGridView.Size = new Size(957, 305); dataGridView.TabIndex = 1; // // buttonCreateOrder // - buttonCreateOrder.Location = new Point(816, 34); + buttonCreateOrder.Location = new Point(975, 34); buttonCreateOrder.Margin = new Padding(3, 2, 3, 2); buttonCreateOrder.Name = "buttonCreateOrder"; buttonCreateOrder.Size = new Size(170, 22); @@ -138,7 +154,7 @@ // // buttonTakeOrderInWork // - buttonTakeOrderInWork.Location = new Point(816, 60); + buttonTakeOrderInWork.Location = new Point(975, 60); buttonTakeOrderInWork.Margin = new Padding(3, 2, 3, 2); buttonTakeOrderInWork.Name = "buttonTakeOrderInWork"; buttonTakeOrderInWork.Size = new Size(170, 22); @@ -149,7 +165,7 @@ // // buttonOrderReady // - buttonOrderReady.Location = new Point(816, 86); + buttonOrderReady.Location = new Point(975, 86); buttonOrderReady.Margin = new Padding(3, 2, 3, 2); buttonOrderReady.Name = "buttonOrderReady"; buttonOrderReady.Size = new Size(170, 22); @@ -160,7 +176,7 @@ // // buttonIssuedOrder // - buttonIssuedOrder.Location = new Point(816, 112); + buttonIssuedOrder.Location = new Point(975, 112); buttonIssuedOrder.Margin = new Padding(3, 2, 3, 2); buttonIssuedOrder.Name = "buttonIssuedOrder"; buttonIssuedOrder.Size = new Size(170, 22); @@ -171,7 +187,7 @@ // // buttonRef // - buttonRef.Location = new Point(816, 138); + buttonRef.Location = new Point(975, 138); buttonRef.Margin = new Padding(3, 2, 3, 2); buttonRef.Name = "buttonRef"; buttonRef.Size = new Size(170, 22); @@ -184,7 +200,7 @@ // AutoScaleDimensions = new SizeF(7F, 15F); AutoScaleMode = AutoScaleMode.Font; - ClientSize = new Size(997, 338); + ClientSize = new Size(1149, 338); Controls.Add(buttonRef); Controls.Add(buttonIssuedOrder); Controls.Add(buttonOrderReady); @@ -195,7 +211,7 @@ MainMenuStrip = menuStrip; Margin = new Padding(3, 2, 3, 2); Name = "FormMain"; - Text = "Магазин систем безопасности"; + Text = "Лавка с мороженым"; Load += FormMain_Load; menuStrip.ResumeLayout(false); menuStrip.PerformLayout(); @@ -208,7 +224,7 @@ private MenuStrip menuStrip; private ToolStripMenuItem справочникиToolStripMenuItem; - private ToolStripMenuItem FacilitiesToolStripMenuItem; + private ToolStripMenuItem FacilitiessToolStripMenuItem; private ToolStripMenuItem SecuresToolStripMenuItem; private DataGridView dataGridView; private Button buttonCreateOrder; @@ -218,8 +234,10 @@ private Button buttonRef; private ToolStripMenuItem отчётыToolStripMenuItem; private ToolStripMenuItem SecuresReportToolStripMenuItem; - private ToolStripMenuItem SecureFacilitiesReportToolStripMenuItem; + private ToolStripMenuItem SecureFacilitiessReportToolStripMenuItem; private ToolStripMenuItem OrdersReportToolStripMenuItem; private ToolStripMenuItem ClientsToolStripMenuItem; + private ToolStripMenuItem ImplementersToolStripMenuItem; + private ToolStripMenuItem StartWorkingToolStripMenuItem; } } \ No newline at end of file diff --git a/Secure/SecureShop/FormMain.cs b/Secure/SecureShop/FormMain.cs index f38c14d..05d0f9a 100644 --- a/Secure/SecureShop/FormMain.cs +++ b/Secure/SecureShop/FormMain.cs @@ -1,6 +1,6 @@ -using SecureShopContracts.BindingModels; +using SecureShopBusinessLogic.BusinessLogics; +using SecureShopContracts.BindingModels; using SecureShopContracts.BusinessLogicsContracts; -using SecureShopDataModels.Enums; using Microsoft.Extensions.Logging; namespace SecureShopView @@ -10,13 +10,17 @@ namespace SecureShopView private readonly ILogger _logger; private readonly IOrderLogic _orderLogic; private readonly IReportLogic _reportLogic; + private readonly IWorkProcess _workProcessLogic; + private readonly IImplementerLogic _implementerLogic; - public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic) + public FormMain(ILogger logger, IOrderLogic orderLogic, IReportLogic reportLogic, IWorkProcess workProcess, IImplementerLogic implementerLogic) { InitializeComponent(); _logger = logger; _orderLogic = orderLogic; _reportLogic = reportLogic; + _workProcessLogic = workProcess; + _implementerLogic = implementerLogic; } private void FormMain_Load(object sender, EventArgs e) @@ -34,6 +38,7 @@ namespace SecureShopView dataGridView.DataSource = list; dataGridView.Columns["SecureId"].Visible = false; dataGridView.Columns["ClientId"].Visible = false; + dataGridView.Columns["ImplementerId"].Visible = false; dataGridView.Columns["SecureName"].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill; } _logger.LogInformation("Загрузка заказов"); @@ -45,7 +50,7 @@ namespace SecureShopView } } - private void FacilitiesToolStripMenuItem_Click(object sender, EventArgs e) + private void FacilitiessToolStripMenuItem_Click(object sender, EventArgs e) { var service = Program.ServiceProvider?.GetService(typeof(FormFacilitiess)); if (service is FormFacilitiess form) @@ -168,7 +173,7 @@ namespace SecureShopView } } - private void SecureFacilitiesReportToolStripMenuItem_Click(object sender, EventArgs e) + private void SecureFacilitiessReportToolStripMenuItem_Click(object sender, EventArgs e) { var service = Program.ServiceProvider?.GetService(typeof(FormReportSecureFacilities)); if (service is FormReportSecureFacilities form) @@ -194,5 +199,20 @@ namespace SecureShopView form.ShowDialog(); } } + + private void ImplementersToolStripMenuItem_Click(object sender, EventArgs e) + { + var service = Program.ServiceProvider?.GetService(typeof(FormImplementers)); + if (service is FormImplementers form) + { + form.ShowDialog(); + } + } + + private void StartWorkingToolStripMenuItem_Click(object sender, EventArgs e) + { + _workProcessLogic.DoWork((Program.ServiceProvider?.GetService(typeof(IImplementerLogic)) as IImplementerLogic)!, _orderLogic); + MessageBox.Show("Процесс обработки запущен", "Сообщение", MessageBoxButtons.OK, MessageBoxIcon.Information); + } } } \ No newline at end of file diff --git a/Secure/SecureShop/Program.cs b/Secure/SecureShop/Program.cs index 4840dbc..990aac5 100644 --- a/Secure/SecureShop/Program.cs +++ b/Secure/SecureShop/Program.cs @@ -7,6 +7,7 @@ using NLog.Extensions.Logging; using SecureShopBusinessLogic.OfficePackage; using SecureShopBusinessLogic.OfficePackage.Implements; using SecureShopDatabaseImplement.Implements; +using SecureShopView; namespace SecureShopView { @@ -43,14 +44,19 @@ namespace SecureShopView services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); diff --git a/Secure/SecureShopBusinessLogic/BusinessLogics/ImplementerLogic.cs b/Secure/SecureShopBusinessLogic/BusinessLogics/ImplementerLogic.cs new file mode 100644 index 0000000..9020fa4 --- /dev/null +++ b/Secure/SecureShopBusinessLogic/BusinessLogics/ImplementerLogic.cs @@ -0,0 +1,117 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.BusinessLogicsContracts; +using SecureShopContracts.SearchModels; +using SecureShopContracts.StoragesContracts; +using SecureShopContracts.ViewModels; +using Microsoft.Extensions.Logging; + +namespace SecureShopBusinessLogic.BusinessLogics +{ + public class ImplementerLogic : IImplementerLogic + { + private readonly ILogger _logger; + private readonly IImplementerStorage _implementerStorage; + + public ImplementerLogic(ILogger logger, IImplementerStorage implementerStorage) + { + _logger = logger; + _implementerStorage = implementerStorage; + } + public bool Create(ImplementerBindingModel model) + { + CheckModel(model); + if (_implementerStorage.Insert(model) == null) + { + _logger.LogWarning("Insert 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; + } + + public ImplementerViewModel? ReadElement(ImplementerSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. ImplementerFIO:{ImplementerFIO}. Id:{Id}", model.ImplementerFIO, 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 List? ReadList(ImplementerSearchModel? model) + { + _logger.LogInformation("ReadList. ImplementerFIO:{ImplementerFIO}. Id:{Id}", model?.ImplementerFIO, 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 bool Update(ImplementerBindingModel model) + { + CheckModel(model); + if (_implementerStorage.Update(model) == null) + { + _logger.LogWarning("Update 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 (model.WorkExperience < 0) + { + throw new ArgumentNullException("Опыт работы должен быть больше 0", nameof(model.WorkExperience)); + } + if (model.Qualification < 0) + { + throw new ArgumentNullException("Квалификация должна быть больше 0", nameof(model.Qualification)); + } + _logger.LogInformation("Implementer. ImplementerFIO:{ImplementerFIO}. Id: {Id}", model.ImplementerFIO, model.Id); + var element = _implementerStorage.GetElement(new ImplementerSearchModel + { + ImplementerFIO = model.ImplementerFIO + }); + if (element != null && element.Id != model.Id) + { + throw new InvalidOperationException("Исполнитель с таким ФИО уже есть"); + } + } + } +} \ No newline at end of file diff --git a/Secure/SecureShopBusinessLogic/BusinessLogics/OrderLogic.cs b/Secure/SecureShopBusinessLogic/BusinessLogics/OrderLogic.cs index bee862f..efd4704 100644 --- a/Secure/SecureShopBusinessLogic/BusinessLogics/OrderLogic.cs +++ b/Secure/SecureShopBusinessLogic/BusinessLogics/OrderLogic.cs @@ -86,6 +86,10 @@ namespace SecureShopBusinessLogic.BusinessLogics _logger.LogWarning("Change status operation failed"); return false; } + if (viewModel.ImplementerId.HasValue) + { + model.ImplementerId = viewModel.ImplementerId; + } model.Status = newStatus; model.SecureId = viewModel.SecureId; model.Count = viewModel.Count; @@ -108,6 +112,23 @@ namespace SecureShopBusinessLogic.BusinessLogics return true; } + public OrderViewModel? ReadElement(OrderSearchModel model) + { + if (model == null) + { + throw new ArgumentNullException(nameof(model)); + } + _logger.LogInformation("ReadElement. Id:{Id}", model.Id); + var element = _orderStorage.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 TakeOrderInWork(OrderBindingModel model) { return ChangeStatus(model, OrderStatus.Выполняется); diff --git a/Secure/SecureShopBusinessLogic/BusinessLogics/WorkModeling.cs b/Secure/SecureShopBusinessLogic/BusinessLogics/WorkModeling.cs new file mode 100644 index 0000000..d0ff2d8 --- /dev/null +++ b/Secure/SecureShopBusinessLogic/BusinessLogics/WorkModeling.cs @@ -0,0 +1,144 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.BusinessLogicsContracts; +using SecureShopContracts.SearchModels; +using SecureShopContracts.ViewModels; +using SecureShopDataModels.Enums; +using Microsoft.Extensions.Logging; + +namespace SecureShopBusinessLogic.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.Принят }); + if (orders == null || orders.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("DoWork. Worker {Id} try get order {Order}", implementer.Id, order.Id); + // пытаемся назначить заказ на исполнителя + _orderLogic.TakeOrderInWork(new OrderBindingModel + { + Id = order.Id, + ImplementerId = implementer.Id + }); + // делаем работу + Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 1000) * order.Count); + _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, order.Id); + _orderLogic.OrderReady(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("DoWork. Worker {Id} back to order {Order}", implementer.Id, runOrder.Id); + // доделываем работу + Thread.Sleep(implementer.WorkExperience * _rnd.Next(100, 300) * runOrder.Count); + _logger.LogDebug("DoWork. Worker {Id} finish order {Order}", implementer.Id, runOrder.Id); + _orderLogic.OrderReady(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/Secure/SecureShopContracts/BindingModels/ImplementerBindingModel.cs b/Secure/SecureShopContracts/BindingModels/ImplementerBindingModel.cs new file mode 100644 index 0000000..e2b55a8 --- /dev/null +++ b/Secure/SecureShopContracts/BindingModels/ImplementerBindingModel.cs @@ -0,0 +1,17 @@ +using SecureShopDataModels.Models; + +namespace SecureShopContracts.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; } + } +} \ No newline at end of file diff --git a/Secure/SecureShopContracts/BindingModels/OrderBindingModel.cs b/Secure/SecureShopContracts/BindingModels/OrderBindingModel.cs index 2e69bd6..8ea743b 100644 --- a/Secure/SecureShopContracts/BindingModels/OrderBindingModel.cs +++ b/Secure/SecureShopContracts/BindingModels/OrderBindingModel.cs @@ -7,6 +7,7 @@ namespace SecureShopContracts.BindingModels { public int Id { get; set; } public int SecureId { get; set; } + public int? ImplementerId { get; set; } public int Count { get; set; } public int ClientId { get; set; } public double Sum { get; set; } diff --git a/Secure/SecureShopContracts/BusinessLogicsContracts/IImplementerLogic.cs b/Secure/SecureShopContracts/BusinessLogicsContracts/IImplementerLogic.cs new file mode 100644 index 0000000..f38bfad --- /dev/null +++ b/Secure/SecureShopContracts/BusinessLogicsContracts/IImplementerLogic.cs @@ -0,0 +1,19 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.SearchModels; +using SecureShopContracts.ViewModels; + +namespace SecureShopContracts.BusinessLogicsContracts +{ + public interface IImplementerLogic + { + List? ReadList(ImplementerSearchModel? model); + + ImplementerViewModel? ReadElement(ImplementerSearchModel model); + + bool Create(ImplementerBindingModel model); + + bool Update(ImplementerBindingModel model); + + bool Delete(ImplementerBindingModel model); + } +} \ No newline at end of file diff --git a/Secure/SecureShopContracts/BusinessLogicsContracts/IOrderLogic.cs b/Secure/SecureShopContracts/BusinessLogicsContracts/IOrderLogic.cs index d94b990..3a1c8c8 100644 --- a/Secure/SecureShopContracts/BusinessLogicsContracts/IOrderLogic.cs +++ b/Secure/SecureShopContracts/BusinessLogicsContracts/IOrderLogic.cs @@ -11,5 +11,6 @@ namespace SecureShopContracts.BusinessLogicsContracts bool TakeOrderInWork(OrderBindingModel model); bool OrderReady(OrderBindingModel model); bool IssuedOrder(OrderBindingModel model); + OrderViewModel? ReadElement(OrderSearchModel orderSearchModel); } } \ No newline at end of file diff --git a/Secure/SecureShopContracts/BusinessLogicsContracts/IWorkProcess.cs b/Secure/SecureShopContracts/BusinessLogicsContracts/IWorkProcess.cs new file mode 100644 index 0000000..fb8c232 --- /dev/null +++ b/Secure/SecureShopContracts/BusinessLogicsContracts/IWorkProcess.cs @@ -0,0 +1,10 @@ +namespace SecureShopContracts.BusinessLogicsContracts +{ + public interface IWorkProcess + { + /// + /// Запуск работ + /// + void DoWork(IImplementerLogic implementerLogic, IOrderLogic orderLogic); + } +} \ No newline at end of file diff --git a/Secure/SecureShopContracts/SearchModels/ImplementerSearchModel.cs b/Secure/SecureShopContracts/SearchModels/ImplementerSearchModel.cs new file mode 100644 index 0000000..7961949 --- /dev/null +++ b/Secure/SecureShopContracts/SearchModels/ImplementerSearchModel.cs @@ -0,0 +1,11 @@ +namespace SecureShopContracts.SearchModels +{ + public class ImplementerSearchModel + { + public int? Id { get; set; } + + public string? ImplementerFIO { get; set; } + + public string? Password { get; set; } + } +} \ No newline at end of file diff --git a/Secure/SecureShopContracts/SearchModels/OrderSearchModel.cs b/Secure/SecureShopContracts/SearchModels/OrderSearchModel.cs index ca5a20d..db1e921 100644 --- a/Secure/SecureShopContracts/SearchModels/OrderSearchModel.cs +++ b/Secure/SecureShopContracts/SearchModels/OrderSearchModel.cs @@ -1,9 +1,13 @@ -namespace SecureShopContracts.SearchModels +using SecureShopDataModels.Enums; + +namespace SecureShopContracts.SearchModels { public class OrderSearchModel { public int? Id { get; set; } public int? ClientId { get; set; } + public int? ImplementerId { get; set; } + public OrderStatus? Status { get; set; } public DateTime? DateFrom { get; set; } public DateTime? DateTo { get; set; } } diff --git a/Secure/SecureShopContracts/StoragesContracts/IImplementerStorage.cs b/Secure/SecureShopContracts/StoragesContracts/IImplementerStorage.cs new file mode 100644 index 0000000..4c725e3 --- /dev/null +++ b/Secure/SecureShopContracts/StoragesContracts/IImplementerStorage.cs @@ -0,0 +1,21 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.SearchModels; +using SecureShopContracts.ViewModels; + +namespace SecureShopContracts.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); + } +} \ No newline at end of file diff --git a/Secure/SecureShopContracts/ViewModels/ImplementerViewModel.cs b/Secure/SecureShopContracts/ViewModels/ImplementerViewModel.cs new file mode 100644 index 0000000..d4a2df3 --- /dev/null +++ b/Secure/SecureShopContracts/ViewModels/ImplementerViewModel.cs @@ -0,0 +1,22 @@ +using SecureShopDataModels.Models; +using System.ComponentModel; + +namespace SecureShopContracts.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; } + } +} \ No newline at end of file diff --git a/Secure/SecureShopContracts/ViewModels/OrderViewModel.cs b/Secure/SecureShopContracts/ViewModels/OrderViewModel.cs index 7634f5d..64b7613 100644 --- a/Secure/SecureShopContracts/ViewModels/OrderViewModel.cs +++ b/Secure/SecureShopContracts/ViewModels/OrderViewModel.cs @@ -14,6 +14,10 @@ namespace SecureShopContracts.ViewModels [DisplayName("Система безопасности")] public string SecureName { get; set; } = string.Empty; + public int? ImplementerId { get; set; } + [DisplayName("Исполнитель")] + public string ImplementerFIO { get; set; } = string.Empty; + [DisplayName("Количество")] public int Count { get; set; } diff --git a/Secure/SecureShopDataModels/Models/IImplementerModel.cs b/Secure/SecureShopDataModels/Models/IImplementerModel.cs new file mode 100644 index 0000000..2430e12 --- /dev/null +++ b/Secure/SecureShopDataModels/Models/IImplementerModel.cs @@ -0,0 +1,13 @@ +namespace SecureShopDataModels.Models +{ + public interface IImplementerModel : IId + { + string ImplementerFIO { get; } + + string Password { get; } + + int WorkExperience { get; } + + int Qualification { get; } + } +} \ No newline at end of file diff --git a/Secure/SecureShopDataModels/Models/IOrderModel.cs b/Secure/SecureShopDataModels/Models/IOrderModel.cs index 7aefb3c..b8ce172 100644 --- a/Secure/SecureShopDataModels/Models/IOrderModel.cs +++ b/Secure/SecureShopDataModels/Models/IOrderModel.cs @@ -6,6 +6,7 @@ namespace SecureShopDataModels.Models { int SecureId { get; } int ClientId { get; } + int? ImplementerId { get; } int Count { get; } double Sum { get; } OrderStatus Status { get; } diff --git a/Secure/SecureShopDatabaseImplement/Implements/ImplementerStorage.cs b/Secure/SecureShopDatabaseImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..09ea0b9 --- /dev/null +++ b/Secure/SecureShopDatabaseImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,98 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.SearchModels; +using SecureShopContracts.StoragesContracts; +using SecureShopContracts.ViewModels; +using SecureShopDatabaseImplement.Models; + +namespace SecureShopDatabaseImplement.Implements +{ + public class ImplementerStorage : IImplementerStorage + { + public List GetFullList() + { + using var context = new SecureShopDatabase(); + return context.Implementers + .Select(x => x.GetViewModel) + .ToList(); + } + + public List GetFilteredList(ImplementerSearchModel model) + { + if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.Id.HasValue) + { + return new(); + } + if (model.Id.HasValue) + { + var Implementer = GetElement(model); + return Implementer == null ? new() : new() { Implementer }; + } + if (!string.IsNullOrEmpty(model.ImplementerFIO)) + { + using var context = new SecureShopDatabase(); + return context.Implementers + .Where(x => x.ImplementerFIO.Contains(model.ImplementerFIO)) + .Select(x => x.GetViewModel) + .ToList(); + } + return new(); + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + using var context = new SecureShopDatabase(); + if (model.Id.HasValue) + return context.Implementers + .FirstOrDefault(x => x.Id == model.Id) + ?.GetViewModel; + if (!string.IsNullOrEmpty(model.ImplementerFIO) && !string.IsNullOrEmpty(model.Password)) + return context.Implementers + .FirstOrDefault(x => x.ImplementerFIO == model.ImplementerFIO && x.Password == model.Password) + ?.GetViewModel; + if (!string.IsNullOrEmpty(model.ImplementerFIO)) + return context.Implementers + .FirstOrDefault(x => x.ImplementerFIO == model.ImplementerFIO) + ?.GetViewModel; + return null; + } + + public ImplementerViewModel? Insert(ImplementerBindingModel model) + { + var newImplementer = Implementer.Create(model); + if (newImplementer == null) + { + return null; + } + using var context = new SecureShopDatabase(); + context.Implementers.Add(newImplementer); + context.SaveChanges(); + return newImplementer.GetViewModel; + } + + public ImplementerViewModel? Update(ImplementerBindingModel model) + { + using var context = new SecureShopDatabase(); + var additive = context.Implementers.FirstOrDefault(x => x.Id == model.Id); + if (additive == null) + { + return null; + } + additive.Update(model); + context.SaveChanges(); + return additive.GetViewModel; + } + + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + using var context = new SecureShopDatabase(); + var element = context.Implementers.FirstOrDefault(rec => rec.Id == model.Id); + if (element != null) + { + context.Implementers.Remove(element); + context.SaveChanges(); + return element.GetViewModel; + } + return null; + } + } +} \ No newline at end of file diff --git a/Secure/SecureShopDatabaseImplement/Implements/OrderStorage.cs b/Secure/SecureShopDatabaseImplement/Implements/OrderStorage.cs index 0c50aa2..52d0b05 100644 --- a/Secure/SecureShopDatabaseImplement/Implements/OrderStorage.cs +++ b/Secure/SecureShopDatabaseImplement/Implements/OrderStorage.cs @@ -20,6 +20,7 @@ namespace SecureShopDatabaseImplement.Implements var deletedElement = context.Orders .Include(x => x.Secure) .Include(x => x.Client) + .Include(x => x.Implementer) .FirstOrDefault(x => x.Id == model.Id) ?.GetViewModel; context.Orders.Remove(element); @@ -31,15 +32,34 @@ namespace SecureShopDatabaseImplement.Implements public OrderViewModel? GetElement(OrderSearchModel model) { - if (!model.Id.HasValue) + using var context = new SecureShopDatabase(); + if (model.ImplementerId.HasValue && model.Status.HasValue) + { + return context.Orders + .Include(x => x.Secure) + .Include(x => x.Client) + .Include(x => x.Implementer) + .FirstOrDefault(x => x.ImplementerId == model.ImplementerId && x.Status == model.Status) + ?.GetViewModel; + } + if (model.ImplementerId.HasValue) + { + return context.Orders + .Include(x => x.Secure) + .Include(x => x.Client) + .Include(x => x.Implementer) + .FirstOrDefault(x => x.ImplementerId == model.ImplementerId) + ?.GetViewModel; + } + if (!model.Id.HasValue) { return null; } - using var context = new SecureShopDatabase(); return context.Orders .Include(x => x.Secure) .Include(x => x.Client) - .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) + .Include(x => x.Implementer) + .FirstOrDefault(x => model.Id.HasValue && x.Id == model.Id) ?.GetViewModel; } @@ -51,11 +71,22 @@ namespace SecureShopDatabaseImplement.Implements { return context.Orders.Include(x => x.Secure) .Include(x => x.Client) + .Include(x => x.Implementer) .Where(x => x.ClientId == model.ClientId) .Select(x => x.GetViewModel) .ToList(); } - if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue) + if (model.Status.HasValue) + { + return context.Orders + .Include(x => x.Secure) + .Include(x => x.Client) + .Include(x => x.Implementer) + .Where(x => x.Status == model.Status) + .Select(x => x.GetViewModel) + .ToList(); + } + if (!model.Id.HasValue && !model.DateFrom.HasValue && !model.DateTo.HasValue) return new(); if (!model.Id.HasValue && model.DateFrom.HasValue && model.DateTo.HasValue) { @@ -69,7 +100,8 @@ namespace SecureShopDatabaseImplement.Implements return context.Orders .Include(x => x.Secure) .Include(x => x.Client) - .Where(x => x.Id == model.Id) + .Include(x => x.Implementer) + .Where(x => x.Id == model.Id) .Select(x => x.GetViewModel) .ToList(); } @@ -80,7 +112,8 @@ namespace SecureShopDatabaseImplement.Implements return context.Orders .Include(x => x.Secure) .Include(x => x.Client) - .Select(x => x.GetViewModel) + .Include(x => x.Implementer) + .Select(x => x.GetViewModel) .ToList(); } @@ -97,7 +130,8 @@ namespace SecureShopDatabaseImplement.Implements return context.Orders .Include(x => x.Secure) .Include(x => x.Client) - .FirstOrDefault(x => x.Id == newOrder.Id) + .Include(x => x.Implementer) + .FirstOrDefault(x => x.Id == newOrder.Id) ?.GetViewModel; } @@ -114,7 +148,8 @@ namespace SecureShopDatabaseImplement.Implements return context.Orders .Include(x => x.Secure) .Include(x => x.Client) - .FirstOrDefault(x => x.Id == model.Id) + .Include(x => x.Implementer) + .FirstOrDefault(x => x.Id == model.Id) ?.GetViewModel; } } diff --git a/Secure/SecureShopDatabaseImplement/Models/Implementer.cs b/Secure/SecureShopDatabaseImplement/Models/Implementer.cs new file mode 100644 index 0000000..4a3295e --- /dev/null +++ b/Secure/SecureShopDatabaseImplement/Models/Implementer.cs @@ -0,0 +1,72 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.ViewModels; +using SecureShopDataModels.Models; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace SecureShopDatabaseImplement.Models +{ + public class Implementer : IImplementerModel + { + [Required] + public string ImplementerFIO { get; private set; } = string.Empty; + [Required] + public string Password { get; private set; } = string.Empty; + [Required] + public int WorkExperience { get; private set; } + [Required] + public int Qualification { get; private set; } + [Required] + public int Id { get; private set; } + [ForeignKey("ImplementerId")] + public virtual List Orders { get; set; } = new(); + public static Implementer? Create(ImplementerBindingModel model) + { + if (model == null) + { + return null; + } + return new Implementer() + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + Qualification = model.Qualification, + WorkExperience = model.WorkExperience, + Password = model.Password + }; + } + + public static Implementer Create(ImplementerViewModel model) + { + return new Implementer + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + Qualification = model.Qualification, + WorkExperience = model.WorkExperience, + Password = model.Password + }; + } + + public void Update(ImplementerBindingModel model) + { + if (model == null) + { + return; + } + ImplementerFIO = model.ImplementerFIO; + Password = model.Password; + Qualification = model.Qualification; + WorkExperience = model.WorkExperience; + } + + public ImplementerViewModel GetViewModel => new() + { + Id = Id, + ImplementerFIO = ImplementerFIO, + Qualification = Qualification, + WorkExperience = WorkExperience, + Password = Password + }; + } +} \ No newline at end of file diff --git a/Secure/SecureShopDatabaseImplement/Models/Order.cs b/Secure/SecureShopDatabaseImplement/Models/Order.cs index 97de6f4..9a39040 100644 --- a/Secure/SecureShopDatabaseImplement/Models/Order.cs +++ b/Secure/SecureShopDatabaseImplement/Models/Order.cs @@ -1,4 +1,5 @@ -using SecureShopContracts.BindingModels; +using SecureShopDatabaseImplement.Models; +using SecureShopContracts.BindingModels; using SecureShopContracts.ViewModels; using SecureShopDataModels.Enums; using SecureShopDataModels.Models; @@ -14,6 +15,8 @@ namespace SecureShopDatabaseImplement.Models [Required] public int ClientId { get; set; } [Required] + public int? ImplementerId { get; set; } + [Required] public int Count { get; set; } [Required] public double Sum { get; set; } @@ -27,6 +30,8 @@ namespace SecureShopDatabaseImplement.Models public int Id { get; set; } public virtual Secure Secure { get; set; } public virtual Client Client { get; set; } + public virtual Implementer? Implementer { get; set; } + public static Order? Create(OrderBindingModel? model) { if (model == null) @@ -38,6 +43,7 @@ namespace SecureShopDatabaseImplement.Models Id = model.Id, SecureId = model.SecureId, ClientId = model.ClientId, + ImplementerId = model.ImplementerId, Count = model.Count, Sum = model.Sum, Status = model.Status, @@ -54,6 +60,7 @@ namespace SecureShopDatabaseImplement.Models } Status = model.Status; DateImplement = model.DateImplement; + ImplementerId = model.ImplementerId; } public OrderViewModel GetViewModel => new() @@ -61,6 +68,7 @@ namespace SecureShopDatabaseImplement.Models Id = Id, SecureId = SecureId, ClientId = ClientId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, diff --git a/Secure/SecureShopDatabaseImplement/SecureShopDatabase.cs b/Secure/SecureShopDatabaseImplement/SecureShopDatabase.cs index c7ab861..59f3911 100644 --- a/Secure/SecureShopDatabaseImplement/SecureShopDatabase.cs +++ b/Secure/SecureShopDatabaseImplement/SecureShopDatabase.cs @@ -23,5 +23,7 @@ namespace SecureShopDatabaseImplement public virtual DbSet Orders { set; get; } public virtual DbSet Clients { set; get; } + + public virtual DbSet Implementers { set; get; } } } diff --git a/Secure/SecureShopFileImplement/Models/Order.cs b/Secure/SecureShopFileImplement/Models/Order.cs index 02995c7..d62c98e 100644 --- a/Secure/SecureShopFileImplement/Models/Order.cs +++ b/Secure/SecureShopFileImplement/Models/Order.cs @@ -12,6 +12,7 @@ namespace SecureShopFileImplement.Models public int Id { get; private set; } public int SecureId { 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; private set; } public OrderStatus Status { get; private set; } @@ -88,5 +89,7 @@ namespace SecureShopFileImplement.Models public XElement GetXElement => new("Order", new XAttribute("Id", Id), new XElement("SecureId", SecureId.ToString()), new XElement("ClientId", ClientId.ToString()), new XElement("Count", Count.ToString()), new XElement("Sum", Sum.ToString()), new XElement("Status", Status.ToString()), new XElement("DateCreate", DateCreate.ToString()), new XElement("DateImplement", DateImplement.ToString()) ); + + } } \ No newline at end of file diff --git a/Secure/SecureShopListImplement/DataListSingleton.cs b/Secure/SecureShopListImplement/DataListSingleton.cs index 49599a3..d4e626f 100644 --- a/Secure/SecureShopListImplement/DataListSingleton.cs +++ b/Secure/SecureShopListImplement/DataListSingleton.cs @@ -9,6 +9,7 @@ namespace SecureShopListImplement public List Orders { get; set; } public List Secures { get; set; } public List Clients { get; set; } + public List Implementers { get; set; } private DataListSingleton() { @@ -16,6 +17,7 @@ namespace SecureShopListImplement Orders = new List(); Secures = new List(); Clients = new List(); + Implementers = new(); } public static DataListSingleton GetInstance() diff --git a/Secure/SecureShopListImplement/Implements/ImplementerStorage.cs b/Secure/SecureShopListImplement/Implements/ImplementerStorage.cs new file mode 100644 index 0000000..552ac14 --- /dev/null +++ b/Secure/SecureShopListImplement/Implements/ImplementerStorage.cs @@ -0,0 +1,113 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.SearchModels; +using SecureShopContracts.StoragesContracts; +using SecureShopContracts.ViewModels; +using SecureShopListImplement.Models; + +namespace SecureShopListImplement.Implements +{ + internal class ImplementerStorage : IImplementerStorage + { + private readonly DataListSingleton _source; + + public ImplementerStorage() + { + _source = DataListSingleton.GetInstance(); + } + public ImplementerViewModel? Delete(ImplementerBindingModel model) + { + for (int i = 0; i < _source.Implementers.Count; ++i) + { + if (_source.Implementers[i].Id == model.Id) + { + var element = _source.Implementers[i]; + _source.Implementers.RemoveAt(i); + return element.GetViewModel; + } + } + return null; + } + + public ImplementerViewModel? GetElement(ImplementerSearchModel model) + { + foreach (var elem in _source.Implementers) + { + if (model.Id.HasValue && model.Id == elem.Id) + return elem.GetViewModel; + if (!string.IsNullOrEmpty(model.ImplementerFIO) && !string.IsNullOrEmpty(model.Password) && elem.ImplementerFIO == model.ImplementerFIO && elem.Password == model.Password) + return elem.GetViewModel; + if (!string.IsNullOrEmpty(model.ImplementerFIO) && model.ImplementerFIO == elem.ImplementerFIO) + return elem.GetViewModel; + } + return null; + } + + public List GetFilteredList(ImplementerSearchModel model) + { + var result = new List(); + + if (string.IsNullOrEmpty(model.ImplementerFIO) && !model.Id.HasValue) + { + return result; + } + if (model.Id.HasValue) + { + var implementer = GetElement(model); + return implementer == null ? result : new() { implementer }; + } + if (!string.IsNullOrEmpty(model.ImplementerFIO)) + { + foreach (var implementer in _source.Implementers) + { + if (implementer.ImplementerFIO.Contains(model.ImplementerFIO)) + { + result.Add(implementer.GetViewModel); + } + } + } + return result; + } + + public List GetFullList() + { + var result = new List(); + foreach (var implementer in _source.Implementers) + { + result.Add(implementer.GetViewModel); + } + return result; + } + + 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; + } + } +} \ No newline at end of file diff --git a/Secure/SecureShopListImplement/Models/Implementer.cs b/Secure/SecureShopListImplement/Models/Implementer.cs new file mode 100644 index 0000000..8d232fc --- /dev/null +++ b/Secure/SecureShopListImplement/Models/Implementer.cs @@ -0,0 +1,55 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.ViewModels; +using SecureShopDataModels.Models; + +namespace SecureShopListImplement.Models +{ + public class Implementer : IImplementerModel + { + 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 int Id { get; private set; } + public static Implementer? Create(ImplementerBindingModel? model) + { + if (model == null) + { + return null; + } + return new Implementer() + { + Id = model.Id, + ImplementerFIO = model.ImplementerFIO, + Qualification = model.Qualification, + WorkExperience = model.WorkExperience, + Password = model.Password + }; + } + + 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, + Qualification = Qualification, + WorkExperience = WorkExperience + }; + } +} \ No newline at end of file diff --git a/Secure/SecureShopListImplement/Models/Order.cs b/Secure/SecureShopListImplement/Models/Order.cs index 2fc093b..11c7329 100644 --- a/Secure/SecureShopListImplement/Models/Order.cs +++ b/Secure/SecureShopListImplement/Models/Order.cs @@ -10,6 +10,7 @@ namespace SecureShopListImplement.Models public int Id { get; private set; } public int SecureId { 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; private set; } public OrderStatus Status { get; private set; } @@ -27,6 +28,7 @@ namespace SecureShopListImplement.Models Id = model.Id, SecureId = model.SecureId, Count = model.Count, + ImplementerId = model.ImplementerId, Sum = model.Sum, Status = model.Status, DateCreate = model.DateCreate, @@ -42,6 +44,7 @@ namespace SecureShopListImplement.Models } SecureId = model.SecureId; Count = model.Count; + ImplementerId = model.ImplementerId; Sum = model.Sum; Status = model.Status; DateCreate = model.DateCreate; @@ -52,6 +55,7 @@ namespace SecureShopListImplement.Models { Id = Id, SecureId = SecureId, + ImplementerId = ImplementerId, Count = Count, Sum = Sum, Status = Status, diff --git a/Secure/SecureShopRestApi/Controllers/ImplementerController.cs b/Secure/SecureShopRestApi/Controllers/ImplementerController.cs new file mode 100644 index 0000000..d2592fe --- /dev/null +++ b/Secure/SecureShopRestApi/Controllers/ImplementerController.cs @@ -0,0 +1,99 @@ +using SecureShopContracts.BindingModels; +using SecureShopContracts.BusinessLogicsContracts; +using SecureShopContracts.SearchModels; +using SecureShopContracts.ViewModels; +using SecureShopDataModels.Enums; +using Microsoft.AspNetCore.Mvc; + +namespace SecureShopRestApi.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.OrderReady(model); + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка отметки о готовности заказа с №{ Id}", model.Id); + throw; + } + } + } +} \ No newline at end of file diff --git a/Secure/SecureShopRestApi/Program.cs b/Secure/SecureShopRestApi/Program.cs index 850bc16..ec5fcf5 100644 --- a/Secure/SecureShopRestApi/Program.cs +++ b/Secure/SecureShopRestApi/Program.cs @@ -3,7 +3,6 @@ using SecureShopContracts.BusinessLogicsContracts; using SecureShopContracts.StoragesContracts; using SecureShopDatabaseImplement.Implements; using Microsoft.OpenApi.Models; - var builder = WebApplication.CreateBuilder(args); builder.Logging.SetMinimumLevel(LogLevel.Trace); @@ -13,10 +12,12 @@ builder.Logging.AddLog4Net("log4net.config"); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); +builder.Services.AddTransient(); builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle