PIbd-21 Valiulov I.A. LabWork02 #3

Open
Ilyas wants to merge 5 commits from LabWork02 into LabWork01
19 changed files with 570 additions and 76 deletions

View File

@ -9,7 +9,18 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Dapper" Version="2.1.35" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Npgsql" Version="8.0.5" />
<PackageReference Include="Serilog" Version="4.1.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="8.0.4" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Unity" Version="5.11.10" />
<PackageReference Include="Unity.Microsoft.Logging" Version="5.11.1" />
</ItemGroup>
<ItemGroup>
@ -27,4 +38,10 @@
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

View File

@ -3,6 +3,7 @@
public class MaterialReplenishment
{
public int Id { get; private set; }
public DateTime DateReplenishment { get; private set; }
public string Name { get; private set; } = string.Empty;
public int Count { get; private set; }
public static MaterialReplenishment CreateOperation(int id, string name, int count)
@ -10,6 +11,7 @@ public class MaterialReplenishment
return new MaterialReplenishment
{
Id = id,
DateReplenishment = DateTime.Now,
Name = name,
Count = count
};

View File

@ -8,7 +8,7 @@ public class Product
public string Name { get; private set; } = string.Empty;
public ProductType Type { get; private set; }
public int CountInWarehouse { get; private set; }
public IEnumerable<ProductMaterial> ProductMaterial { get; private set; } = [];
public IEnumerable<ProductMaterial> ProductMaterial { get; set; } = [];
public static Product CreateEntity(int id, string name, ProductType type, int countInWarehouse, IEnumerable<ProductMaterial> productMaterial)
{
return new Product

View File

@ -3,8 +3,8 @@
public class ProductMaterial
{
public int Id { get; private set; }
public int MaterialId { get; private set; }
public int Count { get; private set; }
public int MaterialId { get; set; }
public int Count { get; set; }
public static ProductMaterial CreateOperation(int id, int materialId, int count)
{
return new ProductMaterial

View File

@ -34,14 +34,17 @@
labelCount = new Label();
textBoxName = new TextBox();
numericUpDownCount = new NumericUpDown();
comboBoxMaterial = new ComboBox();
labelMaterial = new Label();
((System.ComponentModel.ISupportInitialize)numericUpDownCount).BeginInit();
SuspendLayout();
//
// buttonAdd
//
buttonAdd.Location = new Point(33, 164);
buttonAdd.Location = new Point(38, 219);
buttonAdd.Margin = new Padding(3, 4, 3, 4);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(75, 23);
buttonAdd.Size = new Size(86, 31);
buttonAdd.TabIndex = 1;
buttonAdd.Text = "Add";
buttonAdd.UseVisualStyleBackColor = true;
@ -49,9 +52,10 @@
//
// buttonCancel
//
buttonCancel.Location = new Point(199, 164);
buttonCancel.Location = new Point(227, 219);
buttonCancel.Margin = new Padding(3, 4, 3, 4);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(75, 23);
buttonCancel.Size = new Size(86, 31);
buttonCancel.TabIndex = 2;
buttonCancel.Text = "Cancel";
buttonCancel.UseVisualStyleBackColor = true;
@ -60,47 +64,71 @@
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(33, 46);
labelName.Location = new Point(38, 25);
labelName.Name = "labelName";
labelName.Size = new Size(39, 15);
labelName.Size = new Size(49, 20);
labelName.TabIndex = 3;
labelName.Text = "Name";
//
// labelCount
//
labelCount.AutoSize = true;
labelCount.Location = new Point(33, 97);
labelCount.Location = new Point(38, 129);
labelCount.Name = "labelCount";
labelCount.Size = new Size(40, 15);
labelCount.Size = new Size(48, 20);
labelCount.TabIndex = 4;
labelCount.Text = "Count";
//
// textBoxName
//
textBoxName.Location = new Point(124, 46);
textBoxName.Location = new Point(142, 22);
textBoxName.Margin = new Padding(3, 4, 3, 4);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(120, 23);
textBoxName.Size = new Size(137, 27);
textBoxName.TabIndex = 7;
//
// numericUpDownCount
//
numericUpDownCount.Location = new Point(124, 97);
numericUpDownCount.Location = new Point(142, 129);
numericUpDownCount.Margin = new Padding(3, 4, 3, 4);
numericUpDownCount.Name = "numericUpDownCount";
numericUpDownCount.Size = new Size(120, 23);
numericUpDownCount.Size = new Size(137, 27);
numericUpDownCount.TabIndex = 8;
//
// FormMaterialSpent
// comboBoxMaterial
//
AutoScaleDimensions = new SizeF(7F, 15F);
comboBoxMaterial.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxMaterial.FormattingEnabled = true;
comboBoxMaterial.Location = new Point(142, 70);
comboBoxMaterial.Margin = new Padding(3, 4, 3, 4);
comboBoxMaterial.Name = "comboBoxMaterial";
comboBoxMaterial.Size = new Size(137, 28);
comboBoxMaterial.TabIndex = 9;
//
// labelMaterial
//
labelMaterial.AutoSize = true;
labelMaterial.Location = new Point(37, 73);
labelMaterial.Name = "labelMaterial";
labelMaterial.Size = new Size(64, 20);
labelMaterial.TabIndex = 10;
labelMaterial.Text = "Material";
//
// FormMaterialReplenishment
//
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(304, 204);
ClientSize = new Size(347, 272);
Controls.Add(labelMaterial);
Controls.Add(comboBoxMaterial);
Controls.Add(numericUpDownCount);
Controls.Add(textBoxName);
Controls.Add(labelCount);
Controls.Add(labelName);
Controls.Add(buttonCancel);
Controls.Add(buttonAdd);
Name = "FormMaterialSpent";
Margin = new Padding(3, 4, 3, 4);
Name = "FormMaterialReplenishment";
Text = "FormMaterialSpent";
((System.ComponentModel.ISupportInitialize)numericUpDownCount).EndInit();
ResumeLayout(false);
@ -115,5 +143,7 @@
private Label labelCount;
private TextBox textBoxName;
private NumericUpDown numericUpDownCount;
private ComboBox comboBoxMaterial;
private Label labelMaterial;
}
}

View File

@ -29,10 +29,13 @@ namespace CarpentryWorkshop.Forms
}
}
}
public FormMaterialReplenishment(IMaterialReplenishmentRepository materialSpentRepository)
public FormMaterialReplenishment(IMaterialReplenishmentRepository materialSpentRepository, IMaterialRepository materialRepository)
{
InitializeComponent();
_materialSpentRepository = materialSpentRepository ?? throw new ArgumentNullException(nameof(materialSpentRepository));
comboBoxMaterial.DataSource = materialRepository.ReadMaterials() ?? throw new ArgumentNullException(nameof(materialRepository));
comboBoxMaterial.DisplayMember = "Name";
comboBoxMaterial.ValueMember = "Id";
}
private MaterialReplenishment CreateMaterialSpent(int id) => MaterialReplenishment.CreateOperation(id, textBoxName.Text, Convert.ToInt32(numericUpDownCount.Value));
private void buttonAdd_Click_1(object sender, EventArgs e)

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Microsoft ResX Schema
Version 2.0
@ -48,7 +48,7 @@
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter

View File

@ -48,9 +48,11 @@
// groupBox
//
groupBox.Controls.Add(dataGridView);
groupBox.Location = new Point(12, 171);
groupBox.Location = new Point(14, 228);
groupBox.Margin = new Padding(3, 4, 3, 4);
groupBox.Name = "groupBox";
groupBox.Size = new Size(567, 267);
groupBox.Padding = new Padding(3, 4, 3, 4);
groupBox.Size = new Size(648, 356);
groupBox.TabIndex = 0;
groupBox.TabStop = false;
groupBox.Text = "groupBox";
@ -61,16 +63,19 @@
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dataGridView.Columns.AddRange(new DataGridViewColumn[] { ColumnMaterials, ColumnCount });
dataGridView.Dock = DockStyle.Fill;
dataGridView.Location = new Point(3, 19);
dataGridView.Location = new Point(3, 24);
dataGridView.Margin = new Padding(3, 4, 3, 4);
dataGridView.MultiSelect = false;
dataGridView.Name = "dataGridView";
dataGridView.RowHeadersWidth = 51;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(561, 245);
dataGridView.Size = new Size(642, 328);
dataGridView.TabIndex = 0;
//
// ColumnMaterials
//
ColumnMaterials.HeaderText = "Materials";
ColumnMaterials.MinimumWidth = 6;
ColumnMaterials.Name = "ColumnMaterials";
ColumnMaterials.Resizable = DataGridViewTriState.True;
ColumnMaterials.SortMode = DataGridViewColumnSortMode.Automatic;
@ -78,14 +83,16 @@
// ColumnCount
//
ColumnCount.HeaderText = "Count";
ColumnCount.MinimumWidth = 6;
ColumnCount.Name = "ColumnCount";
//
// buttonAdd
//
buttonAdd.Anchor = AnchorStyles.Bottom | AnchorStyles.Left;
buttonAdd.Location = new Point(84, 447);
buttonAdd.Location = new Point(96, 596);
buttonAdd.Margin = new Padding(3, 4, 3, 4);
buttonAdd.Name = "buttonAdd";
buttonAdd.Size = new Size(125, 23);
buttonAdd.Size = new Size(143, 31);
buttonAdd.TabIndex = 1;
buttonAdd.Text = "Add";
buttonAdd.UseVisualStyleBackColor = true;
@ -94,9 +101,10 @@
// buttonCancel
//
buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
buttonCancel.Location = new Point(355, 447);
buttonCancel.Location = new Point(406, 596);
buttonCancel.Margin = new Padding(3, 4, 3, 4);
buttonCancel.Name = "buttonCancel";
buttonCancel.Size = new Size(125, 23);
buttonCancel.Size = new Size(143, 31);
buttonCancel.TabIndex = 2;
buttonCancel.Text = "Cancel";
buttonCancel.UseVisualStyleBackColor = true;
@ -105,58 +113,61 @@
// labelName
//
labelName.AutoSize = true;
labelName.Location = new Point(31, 31);
labelName.Location = new Point(35, 41);
labelName.Name = "labelName";
labelName.Size = new Size(39, 15);
labelName.Size = new Size(49, 20);
labelName.TabIndex = 3;
labelName.Text = "Name";
//
// labelType
//
labelType.AutoSize = true;
labelType.Location = new Point(31, 78);
labelType.Location = new Point(35, 104);
labelType.Name = "labelType";
labelType.Size = new Size(76, 15);
labelType.Size = new Size(95, 20);
labelType.TabIndex = 4;
labelType.Text = "Product Type";
//
// labelCountInWarehouse
//
labelCountInWarehouse.AutoSize = true;
labelCountInWarehouse.Location = new Point(31, 130);
labelCountInWarehouse.Location = new Point(35, 173);
labelCountInWarehouse.Name = "labelCountInWarehouse";
labelCountInWarehouse.Size = new Size(113, 15);
labelCountInWarehouse.Size = new Size(139, 20);
labelCountInWarehouse.TabIndex = 5;
labelCountInWarehouse.Text = "Count in warehouse";
//
// textBoxName
//
textBoxName.Location = new Point(188, 28);
textBoxName.Location = new Point(215, 37);
textBoxName.Margin = new Padding(3, 4, 3, 4);
textBoxName.Name = "textBoxName";
textBoxName.Size = new Size(141, 23);
textBoxName.Size = new Size(161, 27);
textBoxName.TabIndex = 6;
//
// comboBoxProduct
//
comboBoxProduct.DropDownStyle = ComboBoxStyle.DropDownList;
comboBoxProduct.FormattingEnabled = true;
comboBoxProduct.Location = new Point(188, 78);
comboBoxProduct.Location = new Point(215, 104);
comboBoxProduct.Margin = new Padding(3, 4, 3, 4);
comboBoxProduct.Name = "comboBoxProduct";
comboBoxProduct.Size = new Size(141, 23);
comboBoxProduct.Size = new Size(161, 28);
comboBoxProduct.TabIndex = 7;
//
// numericUpDownCount
//
numericUpDownCount.Location = new Point(188, 130);
numericUpDownCount.Location = new Point(215, 173);
numericUpDownCount.Margin = new Padding(3, 4, 3, 4);
numericUpDownCount.Name = "numericUpDownCount";
numericUpDownCount.Size = new Size(141, 23);
numericUpDownCount.Size = new Size(161, 27);
numericUpDownCount.TabIndex = 8;
//
// FormMaterialConsumption
// FormProductMaterial
//
AutoScaleDimensions = new SizeF(7F, 15F);
AutoScaleDimensions = new SizeF(8F, 20F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(591, 482);
ClientSize = new Size(675, 643);
Controls.Add(numericUpDownCount);
Controls.Add(comboBoxProduct);
Controls.Add(textBoxName);
@ -166,7 +177,8 @@
Controls.Add(buttonCancel);
Controls.Add(buttonAdd);
Controls.Add(groupBox);
Name = "FormMaterialConsumption";
Margin = new Padding(3, 4, 3, 4);
Name = "FormProductMaterial";
Text = "FormMaterialConsumption";
groupBox.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dataGridView).EndInit();

View File

@ -7,6 +7,7 @@ namespace CarpentryWorkshop.Forms
public partial class FormProductMaterial : Form
{
private readonly IProductRepository _productRepository;
private readonly IMaterialRepository _materialRepository;
private int? _productId;
public int Id
{
@ -23,6 +24,20 @@ namespace CarpentryWorkshop.Forms
comboBoxProduct.SelectedItem = product.Type;
numericUpDownCount.Value = product.CountInWarehouse;
_productId = value;
dataGridView.Rows.Clear();
var rows = new List<DataGridViewRow>();
foreach (var productMaterial in product.ProductMaterial)
{
var material = _materialRepository.ReadMaterialById(productMaterial.MaterialId);
if (material != null)
{
var row = new DataGridViewRow();
row.CreateCells(dataGridView,material.Id, productMaterial.Count);
rows.Add(row);
}
}
dataGridView.Rows.AddRange(rows.ToArray());
}
catch (Exception ex)
{
@ -35,7 +50,7 @@ namespace CarpentryWorkshop.Forms
{
InitializeComponent();
_productRepository = productRepository ?? throw new ArgumentNullException(nameof(productRepository));
_materialRepository = materialRepository ?? throw new ArgumentNullException(nameof(materialRepository));
comboBoxProduct.DataSource = Enum.GetValues(typeof(ProductType));
ColumnMaterials.DataSource = materialRepository.ReadMaterials();

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Microsoft ResX Schema
Version 2.0
@ -48,7 +48,7 @@
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter

View File

@ -1,4 +1,8 @@
using Unity;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using Serilog;
using Unity.Microsoft.Logging;
using CarpentryWorkshop.Repositories;
using CarpentryWorkshop.Repositories.Implementations;
@ -20,12 +24,26 @@ namespace CarpentryWorkshop
private static IUnityContainer CreateContainer()
{
var container = new UnityContainer();
container.AddExtension(new LoggingExtension(CreateLoggerFactory()));
container.RegisterType<IOrderRepository, OrderRepository>();
container.RegisterType<IMaterialRepository, MaterialRepository>();
container.RegisterType<IProductRepository, ProductRepository>();
container.RegisterType<IMaterialReplenishmentRepository, MaterialReplenishmentRepository>();
container.RegisterType<IConnectionString, ConnectionString>();
return container;
}
private static LoggerFactory CreateLoggerFactory()
{
var loggerFactory = new LoggerFactory();
loggerFactory.AddSerilog(new LoggerConfiguration()
.ReadFrom.Configuration(new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build())
.CreateLogger());
return loggerFactory;
}
}
}

View File

@ -0,0 +1,6 @@
namespace CarpentryWorkshop.Repositories;
public interface IConnectionString
{
public string ConnectionString { get; }
}

View File

@ -5,7 +5,6 @@ namespace CarpentryWorkshop.Repositories;
public interface IOrderRepository
{
IEnumerable<Order> ReadOrders(DateTime? dateForm = null, DateTime? dateTo = null, int? orderStatus = null, int? orderId = null);
Order ReadOrderById(int orderId);
void CreateOrder(Order order);
void DeleteOrder(int id);
}

View File

@ -0,0 +1,6 @@
namespace CarpentryWorkshop.Repositories.Implementations;
public class ConnectionString : IConnectionString
{
string IConnectionString.ConnectionString => "Server=localhost;Port=5432;Database=carpentryworkshopp;";
}

View File

@ -1,24 +1,100 @@
using CarpentryWorkshop.Entities;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
namespace CarpentryWorkshop.Repositories.Implementations;
public class MaterialReplenishmentRepository : IMaterialReplenishmentRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<Material> _logger;
public MaterialReplenishmentRepository(IConnectionString connectionString, ILogger<Material> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateMaterialSpent(MaterialReplenishment material)
{
}
public MaterialReplenishment ReadMaterialSpentById(int id)
{
return MaterialReplenishment.CreateOperation(0, string.Empty, 0);
}
public IEnumerable<MaterialReplenishment> ReadMaterialsSpent()
{
return [];
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(material));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryInsert = @"
INSERT INTO MaterialReplenishment (Name, Count)
VALUES (@Name, @Count)";
connection.Execute(queryInsert, material);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void UpdateMaterialSpent(MaterialReplenishment material)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(material));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryUpdate = @"
UPDATE MaterialReplenishment
SET
Name=@Name,
Count=@Count
WHERE Id=@Id";
connection.Execute(queryUpdate, material);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
}
public MaterialReplenishment ReadMaterialSpentById(int id)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT * FROM MaterialReplenishment
WHERE Id=@id";
var material = connection.QueryFirst<MaterialReplenishment>(querySelect, new
{
id
});
_logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(material));
return material;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
public IEnumerable<MaterialReplenishment> ReadMaterialsSpent()
{
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM MaterialReplenishment";
var materials = connection.Query<MaterialReplenishment>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(materials));
return materials;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@ -1,28 +1,120 @@
using CarpentryWorkshop.Entities;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
namespace CarpentryWorkshop.Repositories.Implementations;
public class MaterialRepository : IMaterialRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<Material> _logger;
public MaterialRepository(IConnectionString connectionString, ILogger<Material> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateMaterial(Material material)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(material));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryInsert = @"
INSERT INTO Materials (Name, Count, ReservInWarehouse)
VALUES (@Name, @Count, @ReservInWarehouse)";
connection.Execute(queryInsert, material);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void UpdateMaterial(Material material)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(material));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryUpdate = @"
UPDATE Materials
SET
Name=@Name,
Count=@Count,
ReservInWarehouse=@ReservInWarehouse
WHERE Id=@Id";
connection.Execute(queryUpdate, material);
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
public void DeleteMaterial(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM Materials
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public IEnumerable<Material> ReadMaterials()
{
return [];
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM Materials";
var materials = connection.Query<Material>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(materials));
return materials;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
public Material ReadMaterialById(int id)
{
return Material.CreateEntity(id, string.Empty, 0, 0);
}
public void UpdateMaterial(Material material)
{
_logger.LogInformation("Получение объекта по идентификатору");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT * FROM Materials
WHERE Id=@id";
var material = connection.QueryFirst<Material>(querySelect, new
{
id
});
_logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(material));
return material;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при поиске объекта");
throw;
}
}
}

View File

@ -1,23 +1,90 @@
using CarpentryWorkshop.Entities;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
namespace CarpentryWorkshop.Repositories.Implementations;
public class OrderRepository : IOrderRepository
{
public void CreateOrder(Order feedReplenishment)
private readonly IConnectionString _connectionString;
private readonly ILogger<ProductRepository> _logger;
public OrderRepository(IConnectionString connectionString, ILogger<ProductRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateOrder(Order order)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(order));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
using var transaction = connection.BeginTransaction();
var queryInsert = @"
INSERT INTO Orders (Status, Description)
VALUES (@Status, @Description);
SELECT MAX(Id) FROM Orders";
var orderId = connection.QueryFirst<int>(queryInsert, order, transaction);
var querySubInsert = @"
INSERT INTO Orders_Products (OrderId, ProductId, Count)
VALUES (@OrderId, @ProductId, @Count)";
foreach (var elem in order.OrderProduct)
{
connection.Execute(querySubInsert, new
{
orderId,
elem.ProductId,
elem.Count
}, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void DeleteOrder(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM Orders
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public IEnumerable<Order> ReadOrders(DateTime? dateForm = null, DateTime? dateTo = null, int? orderStatus = null, int? orderId = null)
{
return [];
}
public Order ReadOrderById(int id)
{
return Order.CreateOperation(id, 0, string.Empty, []);
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"SELECT * FROM Orders";
var order = connection.Query<Order>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(order));
return order;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
}

View File

@ -1,28 +1,164 @@
using CarpentryWorkshop.Entities;
using Dapper;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Npgsql;
namespace CarpentryWorkshop.Repositories.Implementations;
public class ProductRepository : IProductRepository
{
private readonly IConnectionString _connectionString;
private readonly ILogger<ProductRepository> _logger;
public ProductRepository(IConnectionString connectionString, ILogger<ProductRepository> logger)
{
_connectionString = connectionString;
_logger = logger;
}
public void CreateProduct(Product product)
{
_logger.LogInformation("Добавление объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(product));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
using var transaction = connection.BeginTransaction();
var queryInsert = @"
INSERT INTO Products (Name, Type, CountInWarehouse)
VALUES (@Name, @Type, @CountInWarehouse);
SELECT MAX(Id) FROM Products";
var productId = connection.QueryFirst<int>(queryInsert, product, transaction);
var querySubInsert = @"
INSERT INTO Products_Materials (ProductId, MaterialId, Count)
VALUES (@ProductId, @MaterialId, @Count)";
foreach (var elem in product.ProductMaterial)
{
connection.Execute(querySubInsert, new
{
productId,
elem.MaterialId,
elem.Count
}, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при добавлении объекта");
throw;
}
}
public void DeleteProduct(int id)
{
_logger.LogInformation("Удаление объекта");
_logger.LogDebug("Объект: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var queryDelete = @"
DELETE FROM Products
WHERE Id=@id";
connection.Execute(queryDelete, new { id });
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при удалении объекта");
throw;
}
}
public IEnumerable<Product> ReadProducts()
{
return [];
_logger.LogInformation("Получение всех объектов");
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"SELECT * FROM Products";
var product = connection.Query<Product>(querySelect);
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(product));
return product;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объектов");
throw;
}
}
public Product ReadProductById(int id)
{
return Product.CreateEntity(id, string.Empty, 0, 0, []);
_logger.LogInformation("Получение объекта по ID: {id}", id);
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = @"
SELECT * FROM Products WHERE Id = @Id;
SELECT m.*, pm.Count FROM Materials m
JOIN Products_Materials pm ON m.Id = pm.MaterialId
WHERE pm.ProductId = @Id";
using var multi = connection.QueryMultiple(querySelect, new { Id = id });
var product = multi.Read<Product>().FirstOrDefault();
if (product != null)
{
var materials = multi.Read<Material>().ToList();
product.ProductMaterial = materials.Select(m => new ProductMaterial
{
MaterialId = m.Id,
Count = m.Count
}).ToList();
}
_logger.LogDebug("Найденный объект: {json}", JsonConvert.SerializeObject(product));
return product;
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при чтении объекта по ID: {id}", id);
throw;
}
}
public void UpdateProduct(Product product)
{
_logger.LogInformation("Редактирование объекта");
_logger.LogDebug("Объект: {json}", JsonConvert.SerializeObject(product));
try
{
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
connection.Open();
using var transaction = connection.BeginTransaction();
var queryUpdate = @"
UPDATE Products
SET Name = @Name, Type = @Type, CountInWarehouse = @CountInWarehouse
WHERE Id = @Id";
connection.Execute(queryUpdate, product, transaction);
var queryDelete = @"
DELETE FROM Products_Materials
WHERE ProductId = @ProductId";
connection.Execute(queryDelete, new { ProductId = product.Id }, transaction);
var querySubInsert = @"
INSERT INTO Products_Materials (ProductId, MaterialId, Count)
VALUES (@ProductId, @MaterialId, @Count)";
foreach (var elem in product.ProductMaterial)
{
connection.Execute(querySubInsert, new
{
ProductId = product.Id,
elem.MaterialId,
elem.Count
}, transaction);
}
transaction.Commit();
}
catch (Exception ex)
{
_logger.LogError(ex, "Ошибка при редактировании объекта");
throw;
}
}
}

View File

@ -0,0 +1,15 @@
{
"Serilog": {
"Using": [ "Serilog.Sinks.File" ],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "Logs.txt",
"rollingInterval": "Day"
}
}
]
}
}