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 c56b0a1..60c26ae 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Contract.cs @@ -1,4 +1,5 @@ using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; +using System.ComponentModel; namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; @@ -6,18 +7,40 @@ public class Contract { public int Id { get; private set; } + [Browsable(false)] public int CustomerID { get; private set; } + [Browsable(false)] public int ExecutorID { get; private set; } + [DisplayName("Заказчик")] + 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 string ExecutorFullName => $"{ExecutorPost} {ExecutorName}"; + + [DisplayName("Тип контракта")] public ContractCategory Category { get; private set; } + [DisplayName("Дата заключения")] public DateTime ConclusionDate { get; private set; } + [DisplayName("Дата окончания")] public DateTime Deadline { get; private set; } + [DisplayName("Сумма платежа")] public int PaymentAmount { get; private set; } + [DisplayName("Услуги")] + public string Service => Services != null ? string.Join(", ", Services.Select(x => $"{x.Description}")) : string.Empty; + + [Browsable(false)] public IEnumerable Services { get; private set; } = []; public static Contract CreateEntity(int id, int customerID, int executorID, @@ -37,18 +60,9 @@ public class Contract }; } - public static Contract CreateEntity(TempServiceContract tempServiceContract, IEnumerable services) + public void SetServices(IEnumerable services) { - return new Contract - { - Id = tempServiceContract.Id, - CustomerID = tempServiceContract.CustomerID, - ExecutorID = tempServiceContract.ExecutorID, - Category = tempServiceContract.Category, - ConclusionDate = tempServiceContract.ConclusionDate, - Deadline = tempServiceContract.Deadline, - PaymentAmount = tempServiceContract.PaymentAmount, - Services = services - }; + if (services != null && services.Any()) + Services = services; } } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Customer.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Customer.cs index c3f26db..88c721c 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Customer.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Customer.cs @@ -1,13 +1,20 @@ -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; +using System.ComponentModel; + +namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; public class Customer { public int Id { get; private set; } + [DisplayName("Имя")] public string Name { get; private set; } = string.Empty; + [DisplayName("Контакты")] public string Contact { get; private set; } = string.Empty; + public string FullName => $"{Name} {Contact}"; + + [DisplayName("Адрес")] public string Address { get; private set; } = string.Empty; public static Customer CreateEntity(int id, string name, string contact, string address) 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 1a7f114..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,15 +1,34 @@ -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; +using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; +using System.ComponentModel; + +namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; public class CustomerExecutorReview { public int Id { get; private set; } + [Browsable(false)] public int CustomerId { get; private set; } + [Browsable(false)] public int ExecutorId { get; private set; } + [DisplayName("Заказчик")] + 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 string ExecutorFullName => $"{ExecutorPost} {ExecutorName}"; + + [DisplayName("Отзыв")] public string Review { get; private set; } = string.Empty; + [DisplayName("Оценка")] public int Grade { get; private set; } public static CustomerExecutorReview CreateElement(int id, int customerId, int executorId, string review, int grade) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Executor.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Executor.cs index b80579e..f2f7183 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Executor.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Executor.cs @@ -1,4 +1,5 @@ using PIbd_23_Gutorov_I.A._IT_Company.Entities.Enums; +using System.ComponentModel; namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; @@ -6,10 +7,14 @@ public class Executor { public int Id { get; private set; } + [DisplayName("Имя")] public string Name { get; private set; } = string.Empty; + [DisplayName("Должность")] public ExecutorPost Post { get; private set; } + public string FullName => $"{Post} {Name}"; + public static Executor CreateEntity(int id, string name, ExecutorPost post) { return new Executor diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Service.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Service.cs index 76ee123..cbaa4be 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/Service.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/Service.cs @@ -1,9 +1,12 @@ -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; +using System.ComponentModel; + +namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; public class Service { public int Id { get; private set; } + [DisplayName("Описание услуги")] public string Description { get; private set; } = string.Empty; public static Service CreateEntity(int id, string description) diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs index 7edd1bd..83d9a1f 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Entities/ServiceContract.cs @@ -1,13 +1,20 @@ -namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; +using System.ComponentModel; + +namespace PIbd_23_Gutorov_I.A._IT_Company.Entities; public class ServiceContract { public int Id { get; private set; } + [Browsable(false)] public int ServiceId { get; private set; } + [Browsable(false)] public int ContractId { get; private set; } + [DisplayName("Описание услуги")] + public string ServiceDescription { get; private set; } = string.Empty; + public static ServiceContract CreateElement(int id, int serviceId, int contractId) { return new ServiceContract 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/FormContract.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs index 2cf5d43..b44ed73 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContract.cs @@ -15,11 +15,11 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms _contractRepository = contractRepository ?? throw new ArgumentNullException(nameof(contractRepository)); comboBoxContractCustomerId.DataSource = customerRepository.ReadCustomers(); - comboBoxContractCustomerId.DisplayMember = "Name"; + comboBoxContractCustomerId.DisplayMember = "FullName"; comboBoxContractCustomerId.ValueMember = "Id"; comboBoxContractExecutorId.DataSource = executorRepository.ReadExecutors(); - comboBoxContractExecutorId.DisplayMember = "Name"; + comboBoxContractExecutorId.DisplayMember = "FullName"; comboBoxContractExecutorId.ValueMember = "Id"; ColumnServiceDescription.DataSource = serviceRepository.ReadServices(); diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContractReport.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContractReport.cs index c45c1d4..fb99dbe 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContractReport.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContractReport.cs @@ -14,7 +14,7 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms _container = container ?? throw new ArgumentNullException(nameof(container)); comboBoxCutomerId.DataSource = customerRepository.ReadCustomers(); - comboBoxCutomerId.DisplayMember = "Name"; + comboBoxCutomerId.DisplayMember = "FullName"; comboBoxCutomerId.ValueMember = "Id"; } 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 abce63a..f1751a3 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormContracts.cs @@ -60,7 +60,13 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _contractRepository.ReadContracts(); + private void LoadList() + { + 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/Forms/FormCustomerExecutorReview.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs index a12334a..0b29a67 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReview.cs @@ -15,11 +15,11 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms throw new ArgumentNullException(nameof(customerExecutorReviewRepository)); comboBoxCustomerExecutorReviewCustomerId.DataSource = customerRepository.ReadCustomers(); - comboBoxCustomerExecutorReviewCustomerId.DisplayMember = "Name"; + comboBoxCustomerExecutorReviewCustomerId.DisplayMember = "FullName"; comboBoxCustomerExecutorReviewCustomerId.ValueMember = "Id"; comboBoxCustomerExecutorReviewExecutorId.DataSource = executorRepository.ReadExecutors(); - comboBoxCustomerExecutorReviewExecutorId.DisplayMember = "Name"; + comboBoxCustomerExecutorReviewExecutorId.DisplayMember = "FullName"; comboBoxCustomerExecutorReviewExecutorId.ValueMember = "Id"; } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReviews.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReviews.cs index 27d60c1..141ecbb 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReviews.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomerExecutorReviews.cs @@ -41,6 +41,10 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _customerExecutorReviewRepository.ReadCustomerExecutorReviews(); + private void LoadList() + { + dataGridViewData.DataSource = _customerExecutorReviewRepository.ReadCustomerExecutorReviews(); + dataGridViewData.Columns["Id"].Visible = false; + } } } diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs index ebceb67..c72b9ab 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormCustomers.cs @@ -78,7 +78,12 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _customerRepository.ReadCustomers(); + private void LoadList() + { + dataGridViewData.DataSource = _customerRepository.ReadCustomers(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["FullName"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs index f4b93ba..361e943 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormExecutors.cs @@ -78,7 +78,12 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _executorRepository.ReadExecutors(); + private void LoadList() + { + dataGridViewData.DataSource = _executorRepository.ReadExecutors(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["FullName"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs index 60f8f62..c473165 100644 --- a/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs +++ b/PIbd-23_Gutorov_I.A._IT-Company/Forms/FormServices.cs @@ -78,7 +78,11 @@ namespace PIbd_23_Gutorov_I.A._IT_Company.Forms } } - private void LoadList() => dataGridViewData.DataSource = _serviceRepository.ReadServices(); + private void LoadList() + { + dataGridViewData.DataSource = _serviceRepository.ReadServices(); + dataGridViewData.Columns["Id"].Visible = false; + } 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..d350597 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,9 +38,8 @@ internal class ChartReport private List<(string Caption, double Value)> GetData(DateTime dateTime) { return _contractRepository - .ReadContracts() - .Where(x => x.ConclusionDate.Date == dateTime.Date) - .GroupBy(x => x.CustomerID, (key, group) => new + .ReadContracts(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1)) + .GroupBy(x => x.CustomerName, (key, group) => new { Id = key, Count = group.Sum(x => x.Services.Count()) 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..7ec93e3 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,28 +42,22 @@ 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) - .GroupBy(x => x.ConclusionDate) + .ReadContracts(customerId: customerId, dateFrom: startDate, dateTo: endDate) + .GroupBy(x => x.ExecutorFullName) .Select(x => new { - x.First().ExecutorID, + x.First().ExecutorFullName, Date = x.First().ConclusionDate, CountIn = (int?)x.Count(), CountOut = (int?)null }) .Union( _contractRepository - .ReadContracts() - .Where(x => x.Deadline >= startDate - && x.Deadline <= endDate - && x.CustomerID == customerId) - .GroupBy(x => x.Deadline) + .ReadContracts(customerId: customerId, dateFrom: startDate, dateTo: endDate) + .GroupBy(x => x.ExecutorFullName) .Select(x => new { - x.First().ExecutorID, + x.First().ExecutorFullName, Date = x.First().Deadline, CountIn = (int?)null, CountOut = (int?)x.Count() @@ -74,13 +68,13 @@ internal class TableReport return new List() { item } .Union(data.Select(x => new string[] { - x.ExecutorID.ToString(), - x.Date.ToString(), - x.CountIn?.ToString() ?? string.Empty, - x.CountOut?.ToString() ?? string.Empty + x.ExecutorFullName, + x.Date.ToString("dd.MM.yyyy"), + x.CountIn?.ToString("N0") ?? string.Empty, + x.CountOut?.ToString("N0") ?? string.Empty })) .Union( - [["Всего", "", data.Sum(x => x.CountIn ?? 0).ToString(), data.Sum(x => x.CountOut ?? 0).ToString()]]) + [["Всего", "", data.Sum(x => x.CountIn ?? 0).ToString("N0"), data.Sum(x => x.CountOut ?? 0).ToString("N0")]]) .ToList(); } } 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..dc34316 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,19 +83,65 @@ 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.*, + CONCAT(cu.Name, ' ', cu.Contact) as CustomerName, + e.Post as ExecutorPost, + e.Name as ExecutorName, + sc.ServiceId, + s.Description as ServiceDescription 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 contractsDict = new Dictionary>(); + + var contracts = connection.Query(querySelect, (contract, serviceContract) => + { + if (!contractsDict.TryGetValue(contract.Id, out var sc)) + { + sc = []; + contractsDict.Add(contract.Id, sc); + } + + sc.Add(serviceContract); + return contract; + }, splitOn: "ServiceId", param: 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(); + + return contractsDict.Select(x => + { + var c = contracts.First(y => y.Id == x.Key); + c.SetServices(x.Value.Select(x => Service.CreateEntity(x.ServiceId, x.ServiceDescription))); + return c; + }).ToArray(); } catch (Exception 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