From 03f05c7dc2dc7e17323144f63c3a03f894de2e4f Mon Sep 17 00:00:00 2001 From: ikswi Date: Mon, 23 Dec 2024 12:15:32 +0400 Subject: [PATCH 1/2] =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectPassengerTransfers/Entities/Bus.cs | 5 ++ .../Entities/Passenger.cs | 10 ++++ .../Entities/Route.cs | 9 ++++ .../Entities/Ticket.cs | 26 +++++++--- .../Entities/Trip.cs | 26 +++++++++- .../Entities/TripTicket.cs | 2 +- .../Forms/FormBus.cs | 12 +---- .../Forms/FormBuses.cs | 6 ++- .../Forms/FormPassengers.cs | 6 ++- .../Forms/FormRoutes.cs | 7 ++- .../Forms/FormTicket.cs | 2 +- .../Forms/FormTickets.cs | 7 ++- .../Forms/FormTrips.cs | 6 ++- .../Repositories/ITicketRepository.cs | 3 +- .../Implementations/QueryBuilder.cs | 30 +++++++++++ .../Implementations/TicketRepository.cs | 52 ++++++++++++++++--- .../Implementations/TripRepository.cs | 5 +- 17 files changed, 177 insertions(+), 37 deletions(-) create mode 100644 ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/QueryBuilder.cs diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Bus.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Bus.cs index 3bdbd21..c9200f8 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Bus.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Bus.cs @@ -1,10 +1,15 @@ using ProjectPassengerTransfers.Entities.Enums; +using System.ComponentModel; namespace ProjectPassengerTransfers.Entities; public class Bus { public int Id { get; private set; } + + [DisplayName("Модель")] public BusModel BusModel { get; private set; } + + [DisplayName("Количество мест")] public int SeatCount { get; private set; } public static Bus CreateEntity(int id, BusModel busModel, int seatCount) diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Passenger.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Passenger.cs index 38064b9..1b65aef 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Passenger.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Passenger.cs @@ -1,13 +1,23 @@  using ProjectPassengerTransfers.Entities.Enums; +using System.ComponentModel; namespace ProjectPassengerTransfers.Entities; public class Passenger { public int Id { get; private set; } + + [DisplayName("Тип")] public PassengerType PassengerType { get; private set; } + + [DisplayName("Имя")] public string Name { get; private set; } = string.Empty; + + [DisplayName("Фамилия")] public string Surname { get; private set; } = string.Empty; + + public string FullName => $"{Surname} {Name}"; + public static Passenger CreateEntity(int id, PassengerType passengerType, string name, string surname) { return new Passenger diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Route.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Route.cs index b206708..5f203b7 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Route.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Route.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,9 +10,17 @@ namespace ProjectPassengerTransfers.Entities; public class Route { public int Id { get; private set; } + + [DisplayName("Название")] public string Name { get; private set; } = string.Empty; + + [DisplayName("Город отправки")] public string DepartureCity { get; private set; } = string.Empty; + + [DisplayName("Город назначения")] public string ArrivalCity { get; private set; } = string.Empty; + + [DisplayName("Расстояние")] public int Distance { get; private set; } public static Route CreateEntity(int id, string Name, string departureCity, string arrivalCity, int distance) diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Ticket.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Ticket.cs index 4f75085..f9d9833 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Ticket.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Ticket.cs @@ -1,10 +1,23 @@ -namespace ProjectPassengerTransfers.Entities; +using System.ComponentModel; + +namespace ProjectPassengerTransfers.Entities; public class Ticket { public int Id { get; private set; } + + [DisplayName("Дата продажи")] public DateTime SaleDate { get; private set; } + + [DisplayName("Пассажир")] public int Passenger_Id { get; private set; } + + [DisplayName("Билеты")] + public string Tickets => TripTickets != null ? + string.Join(", ", TripTickets.Select(x => $"{x.TripName}: {x.Count}шт")) : + string.Empty; + + [Browsable(false)] public IEnumerable TripTickets { get; private set; } = []; public static Ticket CreateOperation(int id, int passenger_Id, IEnumerable tripTickets) { @@ -16,14 +29,11 @@ public class Ticket TripTickets = tripTickets }; } - public static Ticket CreateOperation(TempTripTickets tempTripTickets, IEnumerable tripTickets) + public void SetTripTickets(IEnumerable tripTickets) { - return new Ticket + if (tripTickets != null && tripTickets.Any()) { - Id = tempTripTickets.Id, - SaleDate = tempTripTickets.SaleDate, - Passenger_Id = tempTripTickets.Passenger_Id, - TripTickets = tripTickets - }; + TripTickets = tripTickets; + } } } diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Trip.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Trip.cs index 43f2d65..6e21a75 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Trip.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/Trip.cs @@ -1,5 +1,7 @@ -using System; +using ProjectPassengerTransfers.Entities.Enums; +using System; using System.Collections.Generic; +using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; @@ -9,9 +11,29 @@ namespace ProjectPassengerTransfers.Entities; public class Trip { public int Id { get; private set; } - public DateTime Departure { get; private set; } + + [DisplayName("Дата отправки")] + public DateTime Departure { get; private set; } + + [DisplayName("Дата прибытия")] public DateTime Arrival { get; private set; } + + [Browsable(false)] + public int BusModel { get; private set; } + + [Browsable(false)] + public string BusCount { get; private set; } = string.Empty; + + [DisplayName("Маршрут")] + public string RouteName { get; private set; } = string.Empty; + + [DisplayName("Автобус")] + public string BusName => $"{(BusModel)BusModel} {BusCount}"; + + [Browsable(false)] public int Route_Id { get; private set; } + + [Browsable(false)] public int Bus_Id { get; private set; } public static Trip CreateOperation(int id, int route_Id, int bus_Id, DateTime departure, DateTime arrival) diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/TripTicket.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/TripTicket.cs index c298e64..7ff5a45 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/TripTicket.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Entities/TripTicket.cs @@ -10,7 +10,7 @@ public class TripTicket { public int Id { get; private set; } public int Trip_Id { get; private set; } - + public string TripName { get; private set; } = string.Empty; public int Count { get; private set; } public static TripTicket CreateElement(int id, int trip_Id, int count) { diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormBus.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormBus.cs index a300f21..dd5b723 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormBus.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormBus.cs @@ -1,15 +1,7 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using ProjectPassengerTransfers.Entities; +using ProjectPassengerTransfers.Entities; using ProjectPassengerTransfers.Entities.Enums; using ProjectPassengerTransfers.Repositories; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; + namespace ProjectPassengerTransfers.Forms { diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormBuses.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormBuses.cs index 5f1ee02..c2df061 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormBuses.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormBuses.cs @@ -87,7 +87,11 @@ namespace ProjectPassengerTransfers.Forms } } - private void LoadList() => dataGridView.DataSource = _busRepository.ReadBuses(); + private void LoadList() + { + dataGridView.DataSource = _busRepository.ReadBuses(); + dataGridView.Columns["Id"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormPassengers.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormPassengers.cs index 671273a..0ecdaf1 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormPassengers.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormPassengers.cs @@ -90,7 +90,11 @@ namespace ProjectPassengerTransfers.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridView.DataSource = _passengerRepository.ReadPassengers(); + private void LoadList() + { + dataGridView.DataSource = _passengerRepository.ReadPassengers(); + dataGridView.Columns["Id"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormRoutes.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormRoutes.cs index 3dde72f..130711c 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormRoutes.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormRoutes.cs @@ -80,7 +80,12 @@ namespace ProjectPassengerTransfers.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridView.DataSource = _routeRepository.ReadRoutes(); + private void LoadList() + { + dataGridView.DataSource = _routeRepository.ReadRoutes(); + dataGridView.Columns["Id"].Visible = false; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTicket.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTicket.cs index 787360a..b658584 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTicket.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTicket.cs @@ -20,7 +20,7 @@ namespace ProjectPassengerTransfers.Forms InitializeComponent(); _ticketRepository = ticketRepository ?? throw new ArgumentNullException(nameof(ticketRepository)); comboBoxPassenger.DataSource = passengerRepository.ReadPassengers(); - comboBoxPassenger.DisplayMember = "Name"; + comboBoxPassenger.DisplayMember = "FullName"; comboBoxPassenger.ValueMember = "Id"; ColumnTrip.DataSource = routeRepository.ReadRoutes(); ColumnTrip.DisplayMember = "Name"; diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTickets.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTickets.cs index 523d890..922c33f 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTickets.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTickets.cs @@ -75,7 +75,12 @@ namespace ProjectPassengerTransfers.Forms } } - private void LoadList() => dataGridView.DataSource = _ticketRepository.ReadTickets(); + private void LoadList() + { + dataGridView.DataSource = _ticketRepository.ReadTickets(); + dataGridView.Columns["Id"].Visible = false; + } + private bool TryGetIdentifierFromSelectedRow(out int id) { id = 0; diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTrips.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTrips.cs index 3a107d9..afb310c 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTrips.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Forms/FormTrips.cs @@ -47,6 +47,10 @@ namespace ProjectPassengerTransfers.Forms MessageBoxButtons.OK, MessageBoxIcon.Error); } } - private void LoadList() => dataGridView.DataSource = _tripRepository.ReadTrips(); + private void LoadList() + { + dataGridView.DataSource = _tripRepository.ReadTrips(); + dataGridView.Columns["Id"].Visible = false; + } } } diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/ITicketRepository.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/ITicketRepository.cs index 23c393b..c4c00e7 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/ITicketRepository.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/ITicketRepository.cs @@ -4,8 +4,7 @@ namespace ProjectPassengerTransfers.Repositories; public interface ITicketRepository { - IEnumerable ReadTickets(DateTime? dateForm = -null,int? trip_Id = null, int? passenger_Id = null); + IEnumerable ReadTickets(DateTime? dateFrom = null, DateTime? dateTo = null); void CreateTicket(Ticket ticket); void DeleteTicket(int id); diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/QueryBuilder.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..2e853a4 --- /dev/null +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/QueryBuilder.cs @@ -0,0 +1,30 @@ +using System.Text; + +namespace ProjectPassengerTransfers.Repositories.Implementations; + +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}"; + } +} + diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/TicketRepository.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/TicketRepository.cs index acee8e8..b69f7cc 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/TicketRepository.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/TicketRepository.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Npgsql; using ProjectPassengerTransfers.Entities; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace ProjectPassengerTransfers.Repositories.Implementations; @@ -80,18 +81,55 @@ internal class TicketRepository : ITicketRepository } } - public IEnumerable ReadTickets(DateTime? dateForm = null, int? ticketId = null, int? passengerId = null) + public IEnumerable ReadTickets(DateTime? dateFrom = null, DateTime? dateTo = null) { - _logger.LogInformation("Получение всех объектов"); _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("ti.SaleDate >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("ti.SaleDate <= @dateTo"); + } using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT ti.*, trt.Trip_Id, trt.Count FROM Ticket ti - INNER JOIN Trip_Tickets trt on trt.TicketID = ti.Id"; - var ticket = connection.Query(querySelect); - _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(ticket)); - return ticket.GroupBy(x => x.Id, y => y, (key, value) => Ticket.CreateOperation(value.First(), value.Select(z => TripTicket.CreateElement(0, z.Trip_Id, z.Count)))).ToList(); + var querySelect = $@"SELECT + ti.*, + CONCAT(ps.Name, ' ', ps.Surname) as PassengerName, + trt.Trip_Id, + trt.Count, + CONCAT(tr.Departure, ' - ', tr.Arrival) as TripName + FROM Ticket ti + LEFT JOIN Passenger ps on ps.Id = ti.Passenger_ID + INNER JOIN Trip_Tickets trt on trt.TicketID = ti.Id + LEFT JOIN Trip tr on tr.ID = trt.Trip_Id + {builder.Build()}"; + var ticketsDict = new Dictionary>(); + + var tripTickets = connection.Query(querySelect, + (ticket, tripTicket) => + { + if (!ticketsDict.TryGetValue(ticket.Id, out var trt)) + { + trt = []; + ticketsDict.Add(ticket.Id, trt); + } + + trt.Add(tripTicket); + return ticket; + }, splitOn: "Trip_Id", param: new { dateFrom, dateTo }); + _logger.LogDebug("Полученные объекты: {json}", + JsonConvert.SerializeObject(tripTickets)); + + return ticketsDict.Select(x => + { + var cf = tripTickets.First(y => y.Id == x.Key); + cf.SetTripTickets(x.Value); + return cf; + }).ToArray(); } catch (Exception ex) { diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/TripRepository.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/TripRepository.cs index 3afbdfc..9861a28 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/TripRepository.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Repositories/Implementations/TripRepository.cs @@ -47,7 +47,10 @@ int? tripId = null, int? routeId = null, int? busId = null) { using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = "SELECT * FROM Trip"; + var querySelect = @"SELECT tr.*, ro.Name as RouteName, bu.SeatCount as BusCount, bu.BusModel as BusModel + FROM Trip tr + LEFT JOIN Route ro on ro.Id = tr.Route_ID + LEFT JOIN Bus bu on bu.Id = tr.Bus_ID"; var trips = connection.Query(querySelect); _logger.LogDebug("Полученные объекты: {json}", -- 2.25.1 From 44d228b4c6978ff47656ccf6d425c2c8127db4d5 Mon Sep 17 00:00:00 2001 From: ikswi Date: Mon, 23 Dec 2024 12:22:07 +0400 Subject: [PATCH 2/2] =?UTF-8?q?+=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ProjectPassengerTransfers/Reports/ChartReport.cs | 1 - .../ProjectPassengerTransfers/Reports/ExcelBuilder.cs | 3 --- .../ProjectPassengerTransfers/Reports/TableReport.cs | 1 - 3 files changed, 5 deletions(-) diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/ChartReport.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/ChartReport.cs index 2c1a821..916368b 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/ChartReport.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/ChartReport.cs @@ -47,7 +47,6 @@ internal class ChartReport return _ticketRepository .ReadTickets() - .Where(ticket => ticket.SaleDate.Date == dateTime.Date) .SelectMany(ticket => ticket.TripTickets) .GroupBy(tripTicket => { diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/ExcelBuilder.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/ExcelBuilder.cs index d7b8fc7..a5d7e84 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/ExcelBuilder.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/ExcelBuilder.cs @@ -159,7 +159,6 @@ internal class ExcelBuilder }); workbookStylesPart.Stylesheet.Append(fonts); - // Default Fill var fills = new Fills() { Count = 1 }; fills.Append(new Fill { @@ -170,7 +169,6 @@ internal class ExcelBuilder }); workbookStylesPart.Stylesheet.Append(fills); - // Default Border var borders = new Borders() { Count = 2 }; borders.Append(new Border { @@ -190,7 +188,6 @@ internal class ExcelBuilder }); workbookStylesPart.Stylesheet.Append(borders); - // Default cell format and a date cell format var cellFormats = new CellFormats() { Count = 4 }; cellFormats.Append(new CellFormat { diff --git a/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/TableReport.cs b/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/TableReport.cs index 33da632..2447fec 100644 --- a/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/TableReport.cs +++ b/ProjectPassengerTransfers/ProjectPassengerTransfers/Reports/TableReport.cs @@ -57,7 +57,6 @@ public class TableReport var routes = _routeRepository.ReadRoutes().ToDictionary(r => r.Id, r => $"{r.Name} ({r.DepartureCity} - {r.ArrivalCity})"); var tickets = _ticketRepository.ReadTickets() - .Where(t => t.SaleDate >= startDate && t.SaleDate <= endDate) .ToList(); var trips = _tripRepository.ReadTrips().ToDictionary(t => t.Id, t => new -- 2.25.1