PIbd-23 SheymuhovA.I. LabWork04 #4

Closed
sheym wants to merge 3 commits from LabWork4 into LabWork3
21 changed files with 235 additions and 71 deletions

3
.gitignore vendored
View File

@ -407,3 +407,6 @@ FodyWeavers.xsd
/docBuses1.docx
/excel1.xlsx
/pdf1.pdf
*.xlsx
*.docx
*.pdf

View File

@ -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

View File

@ -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)

View File

@ -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)
{

View File

@ -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

View File

@ -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<StartingShiftEmployee> 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> startingShiftEmployee)
public void SetStartingShiftEmployee(IEnumerable<StartingShiftEmployee> 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;
}
}
}

View File

@ -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)

View File

@ -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; }
}

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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)))
{

View File

@ -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)
{

View File

@ -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)
{

View File

@ -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";
}

View File

@ -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";
}
}

View File

@ -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";
}

View File

@ -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)
})

View File

@ -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<string[]> 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<string[]>() { 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();
}
}

View File

@ -60,14 +60,38 @@ WHERE id=@id";
}
public IEnumerable<GoToService> 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<GoToService>(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<GoToService>(querySelect, new { dateFrom, dateTo, broken_elements, price, bus_id });
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(services));
return services;
}

View File

@ -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}";
}
}

View File

@ -50,20 +50,71 @@ VALUES (@Starting_shift_id, @Employee_id, @Work_time)";
}
public IEnumerable<StartingShift> 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<TempStartingShiftEmployee>(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<int, List<StartingShiftEmployee>>();
var startingShifts = connection.Query<StartingShift, StartingShiftEmployee, StartingShift>(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)
{