From c62dd35f93058a06880db62acbeabbf0ccbb1fb9 Mon Sep 17 00:00:00 2001 From: vasmaae Date: Mon, 9 Dec 2024 02:55:48 -0800 Subject: [PATCH] add all except ContractRepository logic --- .../Entities/Contract.cs | 14 +++++++- .../Entities/CustomerExecutorReview.cs | 13 +++++-- .../Entities/TempServiceContract.cs | 24 ------------- .../Forms/FormContracts.cs | 2 ++ .../Reports/ChartReport.cs | 5 ++- .../Reports/TableReport.cs | 7 ++-- .../Implementations/ContractRepository.cs | 36 ++++++++++++++----- .../CustomerExecutorReviewRepository.cs | 19 ++++++++-- .../Implementations/QueryBuilder.cs | 33 +++++++++++++++++ 9 files changed, 105 insertions(+), 48 deletions(-) delete mode 100644 PIbd-23_Gutorov_I.A._IT-Company/Entities/TempServiceContract.cs create mode 100644 PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/QueryBuilder.cs diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs index 37a79df..4d6d45f 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs @@ -16,8 +16,14 @@ public class Contract [DisplayName("Заказчик")] public int CustomerName { get; private set; } + [Browsable(false)] + public ExecutorPost ExecutorPost { get; private set; } + + [Browsable(false)] + public string ExecutorName { get; private set; } = string.Empty; + [DisplayName("Исполнитель")] - public int ExecutorName { get; private set; } + public string ExecutorFullName => $"{ExecutorPost} {ExecutorName}"; [DisplayName("Тип контракта")] public ContractCategory Category { get; private set; } @@ -68,4 +74,10 @@ public class Contract Services = services }; } + + public void SetServices(IEnumerable services) + { + if (services != null && services.Any()) + Services = services; + } } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs index 66f5db1..a79735a 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/CustomerExecutorReview.cs @@ -1,4 +1,5 @@ -using System.ComponentModel; +using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; +using System.ComponentModel; namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; @@ -13,10 +14,16 @@ public class CustomerExecutorReview public int ExecutorId { get; private set; } [DisplayName("Заказчик")] - public int CustomerName { get; private set; } + public string CustomerName { get; private set; } = string.Empty; + + [Browsable(false)] + public ExecutorPost ExecutorPost { get; private set; } + + [Browsable(false)] + public string ExecutorName { get; private set; } = string.Empty; [DisplayName("Исполнитель")] - public int ExecutorName { get; private set; } + public string ExecutorFullName => $"{ExecutorPost} {ExecutorName}"; [DisplayName("Отзыв")] public string Review { get; private set; } = string.Empty; diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/TempServiceContract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/TempServiceContract.cs deleted file mode 100644 index 9509d60..0000000 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/TempServiceContract.cs +++ /dev/null @@ -1,24 +0,0 @@ -using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; - -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; - -public class TempServiceContract -{ - public int Id { get; private set; } - - public int CustomerID { get; private set; } - - public int ExecutorID { get; private set; } - - public ContractCategory Category { get; private set; } - - public DateTime ConclusionDate { get; private set; } - - public DateTime Deadline { get; private set; } - - public int PaymentAmount { get; private set; } - - public int ServiceId { get; private set; } - - public string Description { get; private set; } = string.Empty; -} diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs index 8bf9ffe..f1751a3 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs @@ -64,6 +64,8 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms { dataGridViewData.DataSource = _contractRepository.ReadContracts(); dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["ConclusionDate"].DefaultCellStyle.Format = "dd MMMM yyyy hh:mm"; + dataGridViewData.Columns["Deadline"].DefaultCellStyle.Format = "dd MMMM yyyy hh:mm"; } private bool TryGetIdentifierFromSelectedRow(out int id) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs index dff89b8..c3f808b 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Reports/ChartReport.cs @@ -23,7 +23,7 @@ internal class ChartReport { new PdfBuilder(filePath) .AddHeader("Заключение контрактов") - .AddPieChart("Услуги", GetData(dateTime)) + .AddPieChart($"Оказанные услуги на {dateTime: dd MMMM yyyy}", GetData(dateTime)) .Build(); return true; @@ -38,8 +38,7 @@ internal class ChartReport private List<(string Caption, double Value)> GetData(DateTime dateTime) { return _contractRepository - .ReadContracts() - .Where(x => x.ConclusionDate.Date == dateTime.Date) + .ReadContracts(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1)) .GroupBy(x => x.CustomerID, (key, group) => new { Id = key, diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs index 85c6d5a..8c288da 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Reports/TableReport.cs @@ -26,7 +26,7 @@ internal class TableReport { new ExcelBuilder(filePath) .AddHeader("Сводка по заключениям контрактов", 0, 4) - .AddParagraph("за период", 0) + .AddParagraph($"за период с {startDate:dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0) .AddTable([10, 10, 15, 15], GetData(customerId, startDate, endDate)) .Build(); @@ -42,10 +42,7 @@ internal class TableReport private List GetData(int customerId, DateTime startDate, DateTime endDate) { var data = _contractRepository - .ReadContracts() - .Where(x => x.ConclusionDate >= startDate - && x.ConclusionDate <= endDate - && x.CustomerID == customerId) + .ReadContracts(customerId: customerId, dateFrom: startDate, dateTo: endDate) .GroupBy(x => x.ConclusionDate) .Select(x => new { diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ContractRepository.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ContractRepository.cs index c0123dc..354bd73 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ContractRepository.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/ContractRepository.cs @@ -83,20 +83,38 @@ public class ContractRepository : IContractRepository try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("c.ConclusionDate >= @dateFrom"); + builder.AddCondition("c.Deadline >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("c.ConclusionDate <= @dateTo"); + builder.AddCondition("c.Deadline <= @dateTo"); + } + if (customerId.HasValue) + builder.AddCondition("c.CustomerId >= @customerId"); + if (executorId.HasValue) + builder.AddCondition("c.ExecutorId >= @executorId"); + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @" - SELECT c.*, sc.ServiceId, s.Description + var querySelect = @$" + SELECT c.*, sc.ServiceId, s.Description, + CONCAT(cu.Name, ' ', cu.Contact) as CustomerName, + e.Post as ExecutorPost, + e.Name as ExecutorName FROM Contracts c INNER JOIN ServiceContract sc ON sc.ContractId = c.Id - INNER JOIN Services s ON sc.ServiceId = s.Id + LEFT JOIN Services s ON sc.ServiceId = s.Id + LEFT JOIN Customers cu ON cu.Id = c.CustomerId + LEFT JOIN Executors e ON e.Id = c.ExecutorId + {builder.Build()}; "; - var contracts = connection.Query(querySelect); + var serviceDict = new Dictionary>(); + var contracts = connection.Query(querySelect, new { dateFrom, dateTo, customerId, executorId }); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(contracts)); - return contracts - .GroupBy(x => x.Id, y => y, (key, value) => - Contract.CreateEntity(value.First(), value.Select(z => Service.CreateEntity(z.ServiceId, z.Description)))) - .ToList(); - } catch (Exception ex) { _logger.LogError(ex, "Ошибка при чтении объектов"); diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/CustomerExecutorReviewRepository.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/CustomerExecutorReviewRepository.cs index cefc193..105adbb 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/CustomerExecutorReviewRepository.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/CustomerExecutorReviewRepository.cs @@ -66,11 +66,24 @@ public class CustomerExecutorReviewRepository : ICustomerExecutorReviewRepositor try { + var builder = new QueryBuilder(); + if (customerId.HasValue) + builder.AddCondition("cer.CustomerId = @customerId"); + if (executorId.HasValue) + builder.AddCondition("cer.ExecutorId = @executorId"); + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @" - SELECT * FROM CustomerExecutorReviews; + var querySelect = @$" + SELECT cer.*, + CONCAT(c.Name, ' ', c.Contact) as CustomerName, + e.Post as ExecutorPost, + e.Name as ExecutorName + FROM CustomerExecutorReviews cer + LEFT JOIN Customers c ON c.Id = cer.CustomerId + LEFT JOIN Executors e ON e.Id = cer.ExecutorId + {builder.Build()}; "; - var customerExecutorReviews = connection.Query(querySelect); + var customerExecutorReviews = connection.Query(querySelect, new { customerId, executorId }); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(customerExecutorReviews)); return customerExecutorReviews; } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/QueryBuilder.cs b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..6505cdb --- /dev/null +++ b/PIbd-23_Gutorov_I.A._IT-Company/Repositories/Implementations/QueryBuilder.cs @@ -0,0 +1,33 @@ +using System.Text; + +internal 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}"; + } +} \ No newline at end of file