diff --git a/.gitignore b/.gitignore index 2977950..c38f84d 100644 --- a/.gitignore +++ b/.gitignore @@ -407,3 +407,6 @@ FodyWeavers.xsd /docBuses1.docx /excel1.xlsx /pdf1.pdf +*.xlsx +*.docx +*.pdf diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/Bus.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/Bus.cs index ce1e3f1..14068ae 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/Bus.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/Bus.cs @@ -1,4 +1,5 @@ using ProjectPassengerTransportation.Entities.Enums; +using System.ComponentModel; namespace ProjectPassengerTransportation.Entities; @@ -6,10 +7,14 @@ public class Bus { public int Id { get; private set; } + [DisplayName("Госномер")] public string Licence_plate { get; private set; } = string.Empty; + [DisplayName("Модель автобуса")] public string Model { get; private set; } = string.Empty; + public string Model_and_plate => $"{Model} {Licence_plate}"; + public static Bus CreateEntity(int id, string licencePlate, string model) { return new Bus diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/Employee.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/Employee.cs index 204e90c..bf91d28 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/Employee.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/Employee.cs @@ -1,4 +1,6 @@ -using ProjectPassengerTransportation.Entities.Enums; +using DocumentFormat.OpenXml.Wordprocessing; +using ProjectPassengerTransportation.Entities.Enums; +using System.ComponentModel; namespace ProjectPassengerTransportation.Entities; @@ -6,10 +8,15 @@ public class Employee { public int Id { get; private set; } + [DisplayName("Имя")] public string First_name { get; private set; } = string.Empty; + [DisplayName("Фамилия")] public string Last_name { get; private set; } = string.Empty; + public string Full_name => $"{Last_name} {First_name}"; + + [DisplayName("Должность")] public EmployeePost Post { get; private set; } public static Employee CreateEntity(int id, string first, string last, EmployeePost post) diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/GoToService.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/GoToService.cs index 048b1c1..58965d8 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/GoToService.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/GoToService.cs @@ -1,4 +1,5 @@ using ProjectPassengerTransportation.Entities.Enums; +using System.ComponentModel; namespace ProjectPassengerTransportation.Entities; @@ -6,13 +7,20 @@ public class GoToService { public int Id { get; private set; } - public DateTime Date { get; private set; } + [Browsable(false)] + public int Bus_id { get; private set; } + [DisplayName("Автобус")] + public string Bus_name { get; private set; } = string.Empty; + + [DisplayName("Сломанные элементы")] public BrokenElements Broken_elements { get; private set; } + [DisplayName("Стоимость")] public int Price { get; private set; } - public int Bus_id { get; private set; } + [DisplayName("Дата тех обслуживания")] + public DateTime Date { get; private set; } public static GoToService CreateOperation(int id, BrokenElements brokenElements, int price, int busId) { diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/RouteList.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/RouteList.cs index 8980798..3378ae9 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/RouteList.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/RouteList.cs @@ -1,13 +1,19 @@ -namespace ProjectPassengerTransportation.Entities; +using System.ComponentModel; + +namespace ProjectPassengerTransportation.Entities; public class RouteList { public int Id { get; private set; } + [DisplayName("Начало маршрута")] public TimeSpan Route_start { get; private set; } + [DisplayName("Конец маршрута")] public TimeSpan Route_finish { get; private set; } + public string Route_time => $"{Route_start}-{Route_finish}"; + public static RouteList CreateEntity(int id, TimeSpan start, TimeSpan finish) { return new RouteList diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/StartingShift.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/StartingShift.cs index 2c48190..e55befc 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/StartingShift.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/StartingShift.cs @@ -1,15 +1,31 @@ -namespace ProjectPassengerTransportation.Entities; +using System.ComponentModel; + +namespace ProjectPassengerTransportation.Entities; public class StartingShift { public int Id { get; private set; } - public DateTime Date { get; private set; } - + [Browsable(false)] public int Route_list_id { get; private set; } - + + [Browsable(false)] public int Bus_id { get; private set; } + [DisplayName("Маршрутный лист")] + public string Route_list_name { get; private set; } = string.Empty; + + [DisplayName("Автобус")] + public string Bus_name { get; private set; } = string.Empty; + + [DisplayName("Дата смены")] + public DateTime Date { get; private set; } + + [DisplayName("Работники")] + public string Employee => Starting_shift_employees != null ? + string.Join(", ", Starting_shift_employees.Select(x => $"{x.Employee_name} {x.Work_time}")) : string.Empty; + + [Browsable(false)] public IEnumerable Starting_shift_employees { get; private set; } = []; public static StartingShift CreateOperation(int id, int routeListId, int busId, @@ -25,16 +41,11 @@ public class StartingShift }; } - public static StartingShift CreateOperation(TempStartingShiftEmployee tempStartingShiftEmployee, - IEnumerable startingShiftEmployee) + public void SetStartingShiftEmployee(IEnumerable startingShiftEmployee) { - return new StartingShift + if (startingShiftEmployee != null && startingShiftEmployee.Any()) { - Id = tempStartingShiftEmployee.Starting_shift_id, - Date = tempStartingShiftEmployee.Date, - Route_list_id = tempStartingShiftEmployee.Route_list_id, - Bus_id = tempStartingShiftEmployee.Bus_id, - Starting_shift_employees = startingShiftEmployee - }; + Starting_shift_employees = startingShiftEmployee; + } } } diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/StartingShiftEmployee.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/StartingShiftEmployee.cs index ce5668b..9438d0a 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/StartingShiftEmployee.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/StartingShiftEmployee.cs @@ -1,11 +1,15 @@ -namespace ProjectPassengerTransportation.Entities; +using System.ComponentModel; + +namespace ProjectPassengerTransportation.Entities; public class StartingShiftEmployee { public int Starting_shift_id { get; private set; } - + public int Employee_id { get; private set; } + public string Employee_name { get; private set; } = string.Empty; + public int Work_time { get; private set; } public static StartingShiftEmployee CreateElement(int startingShiftId, int employeeId, int workTime) diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/TempStartingShiftEmployee.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/TempStartingShiftEmployee.cs deleted file mode 100644 index 36ba12b..0000000 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Entities/TempStartingShiftEmployee.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace ProjectPassengerTransportation.Entities; - -public class TempStartingShiftEmployee -{ - public int Starting_shift_id { get; private set; } - - public int Employee_id { get; private set; } - - public int Route_list_id { get; private set; } - - public int Bus_id { get; private set; } - - public DateTime Date { get; private set; } - - public int Work_time { get; private set; } -} diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormBuses.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormBuses.cs index cdd40cb..f910e4e 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormBuses.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormBuses.cs @@ -83,7 +83,12 @@ namespace ProjectPassengerTransportation.Forms } } - private void LoadList() => dataGridViewData.DataSource = _busRepository.ReadBuses(); + private void LoadList() + { + dataGridViewData.DataSource = _busRepository.ReadBuses(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["Model_and_plate"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormEmployees.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormEmployees.cs index f7fcb92..c6c5fee 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormEmployees.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormEmployees.cs @@ -83,7 +83,12 @@ namespace ProjectPassengerTransportation.Forms } } - private void LoadList() => dataGridViewData.DataSource = _employeeRepository.ReadEmployees(); + private void LoadList() + { + dataGridViewData.DataSource = _employeeRepository.ReadEmployees(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["Full_name"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormGoToService.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormGoToService.cs index e5aa738..00f7539 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormGoToService.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormGoToService.cs @@ -13,7 +13,7 @@ namespace ProjectPassengerTransportation.Forms InitializeComponent(); _goToServiceRepository = goToServiceRepository ?? throw new ArgumentNullException(nameof(goToServiceRepository)); comboBoxBus.DataSource = busRepository.ReadBuses(); - comboBoxBus.DisplayMember = "Licence_plate"; + comboBoxBus.DisplayMember = "Model_and_plate"; comboBoxBus.ValueMember = "Id"; foreach (var elem in Enum.GetValues(typeof(BrokenElements))) { diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormGoToServices.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormGoToServices.cs index 95a02e3..5968b6b 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormGoToServices.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormGoToServices.cs @@ -63,7 +63,13 @@ public partial class FormGoToServices : Form } } - private void LoadList() => dataGridViewData.DataSource = _goToServiceRepository.ReadServices(); + private void LoadList() + { + dataGridViewData.DataSource = _goToServiceRepository.ReadServices(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["Date"].DefaultCellStyle.Format = "dd.MM.yyyy"; + + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormRouteLists.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormRouteLists.cs index e9a3e80..24bfb19 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormRouteLists.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormRouteLists.cs @@ -83,7 +83,12 @@ namespace ProjectPassengerTransportation.Forms } } - private void LoadList() => dataGridViewData.DataSource = _routeListRepository.ReadRouteLists(); + private void LoadList() + { + dataGridViewData.DataSource = _routeListRepository.ReadRouteLists(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["Route_time"].Visible = false; + } private bool TryGetIdentifierFromSelectedRow(out int id) { diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormStartingShift.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormStartingShift.cs index 38852d7..2a3b882 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormStartingShift.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormStartingShift.cs @@ -17,10 +17,10 @@ namespace ProjectPassengerTransportation.Forms comboBoxRouteList.DisplayMember = "Id"; comboBoxRouteList.ValueMember = "Id"; comboBoxBus.DataSource = busRepository.ReadBuses(); - comboBoxBus.DisplayMember = "Licence_plate"; + comboBoxBus.DisplayMember = "Model_and_plate"; comboBoxBus.ValueMember = "Id"; ColumnEmployees.DataSource = employeeRepository.ReadEmployees(); - ColumnEmployees.DisplayMember = "First_name"; + ColumnEmployees.DisplayMember = "Full_name"; ColumnEmployees.ValueMember = "Id"; } diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormStartingShifts.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormStartingShifts.cs index 9e27d9f..81cc399 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormStartingShifts.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormStartingShifts.cs @@ -40,5 +40,10 @@ public partial class FormStartingShifts : Form } } - private void LoadList() => dataGridViewData.DataSource = _startingShiftRepository.ReadShifts(); + private void LoadList() + { + dataGridViewData.DataSource = _startingShiftRepository.ReadShifts(); + dataGridViewData.Columns["Id"].Visible = false; + dataGridViewData.Columns["Date"].DefaultCellStyle.Format = "dd MMMM yyyy hh:mm"; + } } diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormWorkReport.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormWorkReport.cs index 1b1d583..6697697 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormWorkReport.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Forms/FormWorkReport.cs @@ -14,10 +14,10 @@ namespace ProjectPassengerTransportation.Forms InitializeComponent(); _container = container ?? throw new ArgumentNullException(nameof(container)); comboBoxEmployee.DataSource = employeeRepository.ReadEmployees(); - comboBoxEmployee.DisplayMember = "First_name"; + comboBoxEmployee.DisplayMember = "Full_name"; comboBoxEmployee.ValueMember = "Id"; comboBoxBus.DataSource = busRepository.ReadBuses(); - comboBoxBus.DisplayMember = "Licence_plate"; + comboBoxBus.DisplayMember = "Model_and_plate"; comboBoxBus.ValueMember = "Id"; } diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Reports/ChartReport.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Reports/ChartReport.cs index 597bd58..8da4f38 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Reports/ChartReport.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Reports/ChartReport.cs @@ -21,7 +21,7 @@ public class ChartReport { new PdfBuilder(filePath) .AddHeader("Тех обслуживание") - .AddPieChart("Количество неисправных элементов", GetData(dateTime)) + .AddPieChart($"Количество неисправных элементов на {dateTime:dd MMMM yyyy}", GetData(dateTime)) .Build(); return true; @@ -36,9 +36,9 @@ public class ChartReport private List<(string Caption, double Value)> GetData(DateTime dateTime) { return _goToServiceRepository - .ReadServices() + .ReadServices(dateFrom: dateTime.Date, dateTo: dateTime.Date.AddDays(1)) .Where(x => x.Date.Date == dateTime.Date) - .GroupBy(x => x.Bus_id, (key, group) => new { + .GroupBy(x => x.Bus_name, (key, group) => new { Id = key, Elements = group.Sum(x => (double)x.Broken_elements) }) diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Reports/TableReport.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Reports/TableReport.cs index 458b474..217e5db 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Reports/TableReport.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Reports/TableReport.cs @@ -28,7 +28,7 @@ public class TableReport { new ExcelBuilder(filePath) .AddHeader("Сводка по работникам и автобусам", 0, 5) - .AddParagraph("за период", 0) + .AddParagraph($"за период c {startDate:dd.MM.yyyy} по {endDate: dd.MM.yyyy}", 0) .AddTable([10, 10, 10, 15, 15], GetData(employeeId, busId, startDate, endDate)) .Build(); return true; @@ -43,11 +43,11 @@ public class TableReport private List GetData(int employeeId, int busId, DateTime startDate, DateTime endDate) { var data = _startingShiftRepository - .ReadShifts() + .ReadShifts(dateFrom: startDate, dateTo: endDate, employeeId: employeeId, busId: busId) .Where(x => x.Date >= startDate && x.Date <= endDate && x.Starting_shift_employees.Any(y => y.Employee_id == employeeId)) .Select(x => new { - EmployeeId = (int?)employeeId, - BusId = (int?)null, + EmployeeId = x.Starting_shift_employees.FirstOrDefault(y => y.Employee_id == employeeId)?.Employee_name, + BusId = (string?)null, x.Date, WorkHours = x.Starting_shift_employees.FirstOrDefault(y => y.Employee_id == employeeId)?.Work_time, Price = (int?)null @@ -56,22 +56,23 @@ public class TableReport .ReadServices() .Where(x => x.Date >= startDate && x.Date <= endDate && x.Bus_id == busId) .Select(x => new { - EmployeeId = (int?)null, - BusId = (int?)busId, + EmployeeId = (string?)null, + BusId = (string?)x.Bus_name, x.Date, WorkHours = (int?)null, Price = (int?)x.Price })) .OrderBy(x => x.Date); + return new List() { item } .Union(data .Select(x => new string[] { - x.EmployeeId.ToString() ?? string.Empty, - x.BusId.ToString() ?? string.Empty, - x.Date.ToString(), - x.WorkHours?.ToString() ?? string.Empty, - x.Price?.ToString() ?? string.Empty})) - .Union([["Всего", "", "", data.Sum(x => x.WorkHours ?? 0).ToString(), data.Sum(x => x.Price ?? 0).ToString()]]) + x.EmployeeId ?? string.Empty, + x.BusId ?? string.Empty, + x.Date.ToString("dd.MM.yyyy"), + x.WorkHours?.ToString("N0") ?? string.Empty, + x.Price?.ToString("N0") ?? string.Empty})) + .Union([["Всего", "", "", data.Sum(x => x.WorkHours ?? 0).ToString("N0"), data.Sum(x => x.Price ?? 0).ToString("N0")]]) .ToList(); } } diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/GoToServiceRepository.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/GoToServiceRepository.cs index b4903f2..1c0f199 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/GoToServiceRepository.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/GoToServiceRepository.cs @@ -60,14 +60,38 @@ WHERE id=@id"; } public IEnumerable ReadServices(DateTime? dateFrom = null, DateTime? dateTo = null, - BrokenElements BrokenElements = BrokenElements.None, int? price = null, int? busId = null) + BrokenElements broken_elements = BrokenElements.None, int? price = null, int? bus_id = null) { _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("gts.date >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("gts.date <= @dateTo"); + } + if (price.HasValue) + { + builder.AddCondition("gts.price = @price"); + } + if (bus_id.HasValue) + { + builder.AddCondition("gts.bus_id = @bus_id"); + } + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @"SELECT * FROM go_to_service"; - var services = connection.Query(querySelect); + var querySelect = @$" +SELECT +gts.*, +b.licence_plate as Bus_name +FROM go_to_service gts +LEFT JOIN bus b on b.id = gts.bus_id +{builder.Build()}"; + var services = connection.Query(querySelect, new { dateFrom, dateTo, broken_elements, price, bus_id }); _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(services)); return services; } diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/QueryBuilder.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/QueryBuilder.cs new file mode 100644 index 0000000..e02f00a --- /dev/null +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/QueryBuilder.cs @@ -0,0 +1,34 @@ +using System.Text; + +namespace ProjectPassengerTransportation.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}"; + } +} diff --git a/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/StartingShiftRepository.cs b/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/StartingShiftRepository.cs index fce1e82..957c02f 100644 --- a/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/StartingShiftRepository.cs +++ b/ProjectPassengerTransportation/ProjectPassengerTransportation/Repositories/Implementations/StartingShiftRepository.cs @@ -50,20 +50,71 @@ VALUES (@Starting_shift_id, @Employee_id, @Work_time)"; } public IEnumerable ReadShifts(DateTime? dateFrom = null, DateTime? dateTo = null, - int? routeListId = null, int? employeeId = null, int? busId = null) + int? route_list_id = null, int? employee_id = null, int? bus_id = null) { _logger.LogInformation("Получение всех объектов"); try { + var builder = new QueryBuilder(); + if (dateFrom.HasValue) + { + builder.AddCondition("ss.date >= @dateFrom"); + } + if (dateTo.HasValue) + { + builder.AddCondition("ss.date <= @dateTo"); + } + if (route_list_id.HasValue) + { + builder.AddCondition("ss.route_list_id = @route_list_id"); + } + if (bus_id.HasValue) + { + builder.AddCondition("ss.bus_id = @bus_id"); + } + if (employee_id.HasValue) + { + builder.AddCondition("sse.employee_id = @employee_id"); + } + using var connection = new NpgsqlConnection(_connectionString.ConnectionString); - var querySelect = @" -SELECT sse.starting_shift_id, ss.date, ss.route_list_id, ss.bus_id, sse.employee_id, sse.work_time FROM starting_shift ss -INNER JOIN starting_shift_employee sse ON sse.starting_shift_id = ss.id"; - var startingShifts = connection.Query(querySelect); + var querySelect = @$" +SELECT +ss.id, +ss.date, +CONCAT(rl.route_start, '-', rl.route_finish) as Route_list_name, +CONCAT(b.model, ' ', b.licence_plate) as Bus_name, +CONCAT(e.first_name, ' ', e.last_name) as Employee_name, +sse.employee_id, +sse.work_time +FROM starting_shift ss +LEFT JOIN route_list rl on rl.id = ss.route_list_id +LEFT JOIN bus b on b.id = ss.bus_id +INNER JOIN starting_shift_employee sse ON sse.starting_shift_id = ss.id +LEFT JOIN employee e on e.id = sse.employee_id +{builder.Build()}"; + + var startingShiftDict = new Dictionary>(); + + var startingShifts = connection.Query(querySelect, (startingShift, startingShifts) => + { + if (!startingShiftDict.TryGetValue(startingShift.Id, out var sse)) + { + sse = []; + startingShiftDict.Add(startingShift.Id, sse); + } + sse.Add(startingShifts); + return startingShift; + }, splitOn: "Employee_name", param: new { dateFrom, dateTo, route_list_id, employee_id, bus_id }); + _logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(startingShifts)); - return startingShifts.GroupBy(x => x.Starting_shift_id, y => y, - (key, value) => StartingShift.CreateOperation(value.First(), - value.Select(z => StartingShiftEmployee.CreateElement(0, z.Employee_id, z.Work_time)))).ToList(); + + return startingShiftDict.Select(x => + { + var ss = startingShifts.First(y => y.Id == x.Key); + ss.SetStartingShiftEmployee(x.Value); + return ss; + }).ToArray(); } catch (Exception ex) {