From 42762d88aac828b3bb2c65aabf0037ae9177936d Mon Sep 17 00:00:00 2001 From: strwbrry1 Date: Wed, 25 Dec 2024 02:43:39 +0400 Subject: [PATCH] lab4 hopefully done --- .../Entities/MaterialsAdmission.cs | 2 + .../Forms/FormContactPeople.cs | 6 +- .../ProjectPublishing/Forms/FormCustomers.cs | 7 +- .../Forms/FormMaterialAdmissions.cs | 6 +- .../ProjectPublishing/Forms/FormMaterials.cs | 6 +- .../ProjectPublishing/Forms/FormOrders.cs | 6 +- .../Forms/FormPrintingHouses.cs | 6 +- .../ProjectPublishing/Reports/ChartReport.cs | 5 +- .../ProjectPublishing/Reports/TableReport.cs | 51 ++++++++------ .../IMaterialAdmissionRepository.cs | 2 +- .../Repositories/IOrderMaterialsRepository.cs | 16 +++++ .../MaterialAdmissionRepository.cs | 21 +++++- .../OrderMaterialsRepository.cs | 68 +++++++++++++++++++ .../Implementations/OrderRepository.cs | 10 ++- .../Implementations/QueryBuilder.cs | 40 +++++++++++ 15 files changed, 217 insertions(+), 35 deletions(-) create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/IOrderMaterialsRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderMaterialsRepository.cs create mode 100644 ProjectPublishing/ProjectPublishing/Repositories/Implementations/QueryBuilder.cs diff --git a/ProjectPublishing/ProjectPublishing/Entities/MaterialsAdmission.cs b/ProjectPublishing/ProjectPublishing/Entities/MaterialsAdmission.cs index ac2ebb4..2a04cf0 100644 --- a/ProjectPublishing/ProjectPublishing/Entities/MaterialsAdmission.cs +++ b/ProjectPublishing/ProjectPublishing/Entities/MaterialsAdmission.cs @@ -20,6 +20,8 @@ namespace ProjectPublishing.Entities [Browsable(false)] public int MaterialId { get; private set; } + [DisplayName("Название материала")] + public string MaterialName { get; private set; } = string.Empty; public static MaterialsAdmission CreateOperation(int id, int amount, int materialId) { return new MaterialsAdmission { Id = id, Amount = amount, DateTime = DateTime.Now, MaterialId = materialId }; diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormContactPeople.cs b/ProjectPublishing/ProjectPublishing/Forms/FormContactPeople.cs index 6a22172..8c810ab 100644 --- a/ProjectPublishing/ProjectPublishing/Forms/FormContactPeople.cs +++ b/ProjectPublishing/ProjectPublishing/Forms/FormContactPeople.cs @@ -89,7 +89,11 @@ namespace ProjectPublishing.Forms } } - private void loadList() => dataGridView.DataSource = _contactPersonRepository.ReadContactPeople(); + private void loadList() + { + dataGridView.DataSource = _contactPersonRepository.ReadContactPeople(); + dataGridView.Columns["Id"].Visible = false; + } private bool tryGetIDFromRow(out int id) { diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormCustomers.cs b/ProjectPublishing/ProjectPublishing/Forms/FormCustomers.cs index 280743c..1d1969d 100644 --- a/ProjectPublishing/ProjectPublishing/Forms/FormCustomers.cs +++ b/ProjectPublishing/ProjectPublishing/Forms/FormCustomers.cs @@ -89,7 +89,12 @@ namespace ProjectPublishing.Forms } } - private void loadList() => dataGridView.DataSource = _customerRepository.ReadCustomers(); + private void loadList() + { + dataGridView.DataSource = _customerRepository.ReadCustomers(); + dataGridView.Columns["Id"].Visible = false; + dataGridView.Columns["FullName"].Visible = false; + } private bool tryGetIDFromRow(out int id) { diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormMaterialAdmissions.cs b/ProjectPublishing/ProjectPublishing/Forms/FormMaterialAdmissions.cs index 2a47864..6ca2739 100644 --- a/ProjectPublishing/ProjectPublishing/Forms/FormMaterialAdmissions.cs +++ b/ProjectPublishing/ProjectPublishing/Forms/FormMaterialAdmissions.cs @@ -49,7 +49,11 @@ namespace ProjectPublishing.Forms } } - private void loadList() => dataGridView.DataSource = _materialAdmissionRepository.ReadMaterialsAdmission(); + private void loadList() + { + dataGridView.DataSource = _materialAdmissionRepository.ReadMaterialsAdmission(); + dataGridView.Columns["Id"].Visible = false; + } private bool tryGetIDFromRow(out int id) { diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormMaterials.cs b/ProjectPublishing/ProjectPublishing/Forms/FormMaterials.cs index 54e8412..de73872 100644 --- a/ProjectPublishing/ProjectPublishing/Forms/FormMaterials.cs +++ b/ProjectPublishing/ProjectPublishing/Forms/FormMaterials.cs @@ -89,7 +89,11 @@ namespace ProjectPublishing.Forms } } - private void loadList() => dataGridView.DataSource = _materialRepository.ReadMaterials(); + private void loadList() + { + dataGridView.DataSource = _materialRepository.ReadMaterials(); + dataGridView.Columns["Id"].Visible = false; + } private bool tryGetIDFromRow(out int id) { diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormOrders.cs b/ProjectPublishing/ProjectPublishing/Forms/FormOrders.cs index 7065c0b..796a6c2 100644 --- a/ProjectPublishing/ProjectPublishing/Forms/FormOrders.cs +++ b/ProjectPublishing/ProjectPublishing/Forms/FormOrders.cs @@ -70,7 +70,11 @@ namespace ProjectPublishing.Forms } } - private void loadList() => dataGridView.DataSource = _orderRepository.ReadOrders(); + private void loadList() + { + dataGridView.DataSource = _orderRepository.ReadOrders(); + dataGridView.Columns["Id"].Visible = false; + } private bool tryGetIDFromRow(out int id) { diff --git a/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.cs b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.cs index c95d67c..7c70a13 100644 --- a/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.cs +++ b/ProjectPublishing/ProjectPublishing/Forms/FormPrintingHouses.cs @@ -89,7 +89,11 @@ namespace ProjectPublishing.Forms } } - private void loadList() => dataGridView.DataSource = _printingHouseRepository.ReadPrintingHouses(); + private void loadList() + { + dataGridView.DataSource = _printingHouseRepository.ReadPrintingHouses(); + dataGridView.Columns["Id"].Visible = false; + } private bool tryGetIDFromRow(out int id) { diff --git a/ProjectPublishing/ProjectPublishing/Reports/ChartReport.cs b/ProjectPublishing/ProjectPublishing/Reports/ChartReport.cs index 3dd13db..bad0396 100644 --- a/ProjectPublishing/ProjectPublishing/Reports/ChartReport.cs +++ b/ProjectPublishing/ProjectPublishing/Reports/ChartReport.cs @@ -43,9 +43,8 @@ namespace ProjectPublishing.Reports private List<(string Caption, double Value)> GetData(DateTime dateTime) { return _materialRepository - .ReadMaterialsAdmission() - .Where(x => x.DateTime.Date == dateTime.Date) - .GroupBy(x => x.MaterialId, (key, group) => new + .ReadMaterialsAdmission(endDate: dateTime) + .GroupBy(x => x.MaterialName, (key, group) => new { Id = key, Count = group.Sum(x => x.Amount) diff --git a/ProjectPublishing/ProjectPublishing/Reports/TableReport.cs b/ProjectPublishing/ProjectPublishing/Reports/TableReport.cs index 10b925c..7f87d87 100644 --- a/ProjectPublishing/ProjectPublishing/Reports/TableReport.cs +++ b/ProjectPublishing/ProjectPublishing/Reports/TableReport.cs @@ -1,6 +1,7 @@ using Microsoft.Extensions.Logging; using Newtonsoft.Json; using ProjectPublishing.Repositories; +using ProjectPublishing.Repositories.Implementations; using System; using System.Collections.Generic; using System.Linq; @@ -13,8 +14,9 @@ namespace ProjectPublishing.Reports { private readonly IOrderRepository _orderRepository; private readonly IMaterialAdmissionRepository _materialAdmissionRepository; + private readonly ILogger _logger; - internal static readonly string[] item = ["Материал", "Дата", "Количество поступило", "Количество заказано"]; + internal static readonly string[] item = ["Материал", "Дата", "Количество поступило", "Количество закупок"]; public TableReport(IOrderRepository orderRepository, IMaterialAdmissionRepository materialAdmissionRepository, ILogger logger) { _orderRepository = orderRepository ?? throw new ArgumentNullException(nameof(orderRepository)); @@ -43,28 +45,39 @@ namespace ProjectPublishing.Reports private List GetData(int materialId, DateTime startDate, DateTime endDate) { var data = _materialAdmissionRepository - .ReadMaterialsAdmission() - .Where(x => x.DateTime >= startDate && x.DateTime <= endDate && x.MaterialId == materialId) + .ReadMaterialsAdmission(startDate, endDate, materialId) .Select(x => new { MaterialId = x.MaterialId, + MaterialName = x.MaterialName, Date = x.DateTime, CountIn = (int?)x.Amount, - CountOut = (int?)null - }) - .Union( - _orderRepository - .ReadOrders() // тут где-то - .Where(x => x.OrderDate >= startDate && x.OrderDate <= endDate.AddDays(1) && x.Materials.Any(y => y.MaterialsId == materialId)) - .SelectMany(order => order.Materials - .Where(m => m.MaterialsId == materialId) - .Select(m => new - { - MaterialId = m.MaterialsId, - Date = order.OrderDate, - CountIn = (int?)null, - CountOut = (int?)m.Amount - }))) - .OrderBy(x => x.Date); + CountOut = (int?)1 + }). + ToList(); + + //var data = _materialAdmissionRepository + // .ReadMaterialsAdmission(startDate, endDate, materialId) + // .Select(x => new { + // MaterialId= x.MaterialId, + // MaterialName = x.MaterialName, + // Date = x.DateTime, + // CountIn = (int?)x.Amount, + // CountOut = (int?)null + // }) + // .Union( + // _orderRepository + // .ReadOrders() // тут где-то + // .Where(x => x.OrderDate >= startDate && x.OrderDate <= endDate.AddDays(1) && x.Materials.Any(y => y.MaterialsId == materialId)) + // .SelectMany(order => order.Materials + // .Where(m => m.MaterialsId == materialId) + // .Select(m => new + // { + // MaterialId = m.MaterialsId, + // Date = order.OrderDate, + // CountIn = (int?)null, + // CountOut = (int?)m.Amount + // }))) + //.OrderBy(x => x.Date); _logger.LogDebug("Объединенные данные в отчет: {json}", JsonConvert.SerializeObject(data)); return new List { item } .Union( diff --git a/ProjectPublishing/ProjectPublishing/Repositories/IMaterialAdmissionRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/IMaterialAdmissionRepository.cs index 1402a95..8191f1b 100644 --- a/ProjectPublishing/ProjectPublishing/Repositories/IMaterialAdmissionRepository.cs +++ b/ProjectPublishing/ProjectPublishing/Repositories/IMaterialAdmissionRepository.cs @@ -9,7 +9,7 @@ namespace ProjectPublishing.Repositories { public interface IMaterialAdmissionRepository { - IEnumerable ReadMaterialsAdmission(); + IEnumerable ReadMaterialsAdmission(DateTime? startDate = null, DateTime? endDate = null, int? materialId = null); void CreateMaterialsAdmission(MaterialsAdmission materialAdmission); diff --git a/ProjectPublishing/ProjectPublishing/Repositories/IOrderMaterialsRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/IOrderMaterialsRepository.cs new file mode 100644 index 0000000..7aa15a9 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/IOrderMaterialsRepository.cs @@ -0,0 +1,16 @@ +using DocumentFormat.OpenXml.Office2013.Excel; +using ProjectPublishing.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories +{ + public interface IOrderMaterialsRepository + { + IEnumerable ReadOrderMaterials(DateTime? startDate = null, DateTime? endDate = null, int? materialId = null); + + } +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/MaterialAdmissionRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/MaterialAdmissionRepository.cs index d113dc9..50fb1a5 100644 --- a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/MaterialAdmissionRepository.cs +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/MaterialAdmissionRepository.cs @@ -1,4 +1,5 @@ using Dapper; +using DocumentFormat.OpenXml.Drawing.Charts; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; @@ -8,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace ProjectPublishing.Repositories.Implementations { @@ -41,15 +43,28 @@ VALUES (@Amount, @MaterialId)"; } } - public IEnumerable ReadMaterialsAdmission() + public IEnumerable ReadMaterialsAdmission(DateTime? startDate = null, DateTime? endDate = null, int? materialId = null) { _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (startDate.HasValue) + { + builder.AddCondition("ma.dateTime >= @startDate"); + } + if (endDate.HasValue) + { + builder.AddCondition("ma.dateTime <= @endDate"); + } + if (materialId.HasValue) + { + builder.AddCondition("ma.MaterialId = @materialId"); + } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM MaterialAdmission"; - var materialAdmissions = connection.Query(querySelect); + var querySelect = @$"SELECT ma.*, m.Name as MaterialName FROM MaterialAdmission as ma LEFT JOIN Material as m ON m.Id = ma.materialId {builder.Build()}"; + var materialAdmissions = connection.Query(querySelect, new {startDate, endDate, materialId}); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(materialAdmissions)); return materialAdmissions; } diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderMaterialsRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderMaterialsRepository.cs new file mode 100644 index 0000000..6501cf6 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderMaterialsRepository.cs @@ -0,0 +1,68 @@ +using Dapper; +using DocumentFormat.OpenXml.Office2010.Excel; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Npgsql; +using ProjectPublishing.Entities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories.Implementations +{ + public class OrderMaterialsRepository : IOrderMaterialsRepository + { + private readonly IConnectionString _connectionString; + private readonly ILogger _logger; + + public OrderMaterialsRepository(ILogger logger, IConnectionString connectionString) + { + _logger = logger; + _connectionString = connectionString; + } + + public IEnumerable ReadOrderMaterials(DateTime? startDate = null, DateTime? endDate = null, int? materialId = null) + { + _logger.LogInformation("Получение всех объектов"); + + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + var querySelect = "SELECT * FROM OrderMaterials"; + var contactPeople = connection.Query(querySelect); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contactPeople)); + return contactPeople; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при чтении объектов"); + throw; + } + } + + public OrderMaterials ReadOrderMaterialsByIds(int orderId, int materialId) + { + _logger.LogInformation("Получение объекта по ID"); + _logger.LogDebug("Объект: {orderId}, {materialId}", orderId, materialId); + try + { + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); + connection.Open(); + var querySelect = @" +SELECT * FROM OrderMaterials +WHERE OrderId=@orderId AND MaterialId = @materialId"; + var orderMaterial = connection.QueryFirst(querySelect, new { orderId, materialId }); + connection.Close(); + _logger.LogDebug("Найден объект: {json}", JsonConvert.SerializeObject(orderMaterial)); + return orderMaterial; + } + catch (Exception ex) + { + _logger.LogError(ex, "Ошибка при поиске объекта"); + throw; + } + } + } +} diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderRepository.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderRepository.cs index fcf6055..3426c5f 100644 --- a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderRepository.cs +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/OrderRepository.cs @@ -1,4 +1,5 @@ using Dapper; +using DocumentFormat.OpenXml.Drawing; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; @@ -97,11 +98,14 @@ LEFT JOIN OrderMaterials ma ON o.Id = ma.OrderId LEFT JOIN Customer c ON o.CustomerId = c.Id LEFT JOIN PrintingHouse ph ON o.PrintingId = ph.Id "; - var printingOrders = connection.Query(querySelect); + // var printingOrders = connection.Query(querySelect); + var orderDict = new Dictionary>(); + var printingOrders = connection.Query(querySelect); + + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(printingOrders)); - return printingOrders.GroupBy(x => x.Id, y => y, (key, value) => - Order.CreateOrder(value.First(), value.Select(z => OrderMaterials.Create(0, z.MaterialsId, z.MaterialsAmount)))).ToList(); + return printingOrders.ToList(); } catch (Exception ex) { diff --git a/ProjectPublishing/ProjectPublishing/Repositories/Implementations/QueryBuilder.cs b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..0b124f2 --- /dev/null +++ b/ProjectPublishing/ProjectPublishing/Repositories/Implementations/QueryBuilder.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace ProjectPublishing.Repositories.Implementations +{ + public class QueryBuilder + { + private readonly StringBuilder _builder; + + public QueryBuilder() + { + _builder = new(); + } + + public QueryBuilder AddCondition(string condition) + { + if (_builder.Length > 0) + { + _builder.Append(" AND "); + } + + _builder.Append(condition); + + return this; + } + + public string Build() + { + if (_builder.Length == 0) + { + return string.Empty; + } + + return $"WHERE {_builder}"; + } + } +}