PIbd-21 Ryabov I.V. LabWork04 #4

Closed
ilyaryabovv wants to merge 1 commits from LabWork_4 into LabWork_3
36 changed files with 198 additions and 67 deletions

View File

@ -1,15 +1,24 @@
using TransportEnterprise.Entities.Enums;
using System.ComponentModel;
using TransportEnterprise.Entities.Enums;
namespace TransportEnterprise.Entities;
public class Bus
{
public int Id { get; private set; }
[DisplayName ("Модель")]
public string Model { get; private set; } = string.Empty;
public int Capacity { get; private set; }
public string LicensePlate { get; private set; } = string.Empty;
[DisplayName("Бренд")]
public string Brand { get; private set; } = string.Empty;
public string BusDisplayName => $"{Brand} {Model} {LicensePlate} ";
[DisplayName("Вместимость")]
public int Capacity { get; private set; }
[DisplayName("Номерной знак")]
public string LicensePlate { get; private set; } = string.Empty;
[DisplayName("Год выпуска")]
public int Year { get; private set; }
[DisplayName("Техническое состояние")]
public TechnicalCondition TechnicalCondition { get; private set; }
public static Bus CreateBus(int id, string model, int capacity, string licensePlate, string brand, int year, TechnicalCondition technicalCondition)

View File

@ -1,13 +1,19 @@
using TransportEnterprise.Entities.Enums;
using DocumentFormat.OpenXml.Wordprocessing;
using System.ComponentModel;
using TransportEnterprise.Entities.Enums;
namespace TransportEnterprise.Entities;
public class Employee
{
public int Id { get; private set; }
[DisplayName("ФИО")]
public string Name { get; private set; } = string.Empty;
[DisplayName("Табельный номер")]
public int Number { get; private set; }
[DisplayName("Должность")]
public PositionOfEmployee PositionOfEmployee { get; private set; }
[DisplayName("Номер телефона")]
public string PhoneNumber { get; private set; } = string.Empty;
public static Employee CreateEmployee(int id, string name, int number, PositionOfEmployee positionOfEmployee, string phoheNumber)
{

View File

@ -1,4 +1,6 @@
namespace TransportEnterprise.Entities.Enums;
using System.ComponentModel.DataAnnotations;
namespace TransportEnterprise.Entities.Enums;
[Flags]
public enum BreakDownType
{

View File

@ -1,10 +1,16 @@
namespace TransportEnterprise.Entities.Enums;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace TransportEnterprise.Entities.Enums;
public enum PositionOfEmployee
{
None = 0,
[Display(Name = "Инженер")]
Enginer = 1,
[Display(Name = "Кондуктор")]
Conductor = 2,
[Display(Name = "Водитель")]
Driver = 3,
Admin = 4
}

View File

@ -1,8 +1,11 @@
namespace TransportEnterprise.Entities.Enums;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;
namespace TransportEnterprise.Entities.Enums;
public enum TechnicalCondition
{
None = 0,
ReadyToGo = 1,
RequiresRepair = 2,
ReadyToGo_NeedsRepair=4
ReadyToGo_NeedsRepair =4
}

View File

@ -1,14 +1,23 @@
using TransportEnterprise.Entities.Enums;
using System.ComponentModel;
using TransportEnterprise.Entities.Enums;
namespace TransportEnterprise.Entities;
public class RepairRequest
{
public int Id { get; private set; }
[Browsable(false)]
public int BusId { get; private set; }
[DisplayName("Тип поломки")]
public BreakDownType BreakDownType { get; private set; }
[DisplayName("Дата")]
public DateTime DateTime { get; private set; }
[Browsable(false)]
public int EmployeeId { get; private set; }
[DisplayName("Автобус")]
public string BusName { get; private set; } = string.Empty;
[DisplayName("Сотрудник")]
public string EmployeeName { get; private set; } = string.Empty;
public static RepairRequest CreateRepairRequest(int id, int busId, BreakDownType breakDownType, DateTime dateTime, int employeeId)
{
return new RepairRequest

View File

@ -1,11 +1,18 @@
namespace TransportEnterprise.Entities;
using System.ComponentModel;
namespace TransportEnterprise.Entities;
public class Route
{
public int Id { get; private set; }
[DisplayName("Название")]
public string Name { get; private set; } = string.Empty;
[DisplayName("Номер")]
public int Number { get; private set; }
public string RouteDisplayName => $"{Number} {Name}";
[DisplayName("Интервал движения")]
public int Interval { get; private set; }
[DisplayName("График движения")]
public string Schedule { get; private set; } = string.Empty;
public static Route CreateRoute (int id, string name, int number, int interval, string schedule)
{

View File

@ -1,13 +1,26 @@

using System.ComponentModel;
namespace TransportEnterprise.Entities;
public class RouteSheet
{
public int Id { get; private set; }
[DisplayName("Дата")]
public DateTime DateTime { get; private set; }
[Browsable(false)]
public int BusId { get; private set; }
[Browsable (false)]
public int RouteId { get; private set; }
[Browsable(false)]
public IEnumerable<RouteSheet_Employee> RouteSheet_Employee { get; private set; } = [];
[DisplayName("Сотрудник")]
public string Employee { get; private set; } = string.Empty;
[DisplayName("Автобус")]
public string BusName { get; private set; } = string.Empty;
[DisplayName("Маршрут")]
public string RouteName { get; private set; } = string.Empty;
public static RouteSheet CreateRouteSheet(int id, DateTime dateTime, int bus, int route, IEnumerable<RouteSheet_Employee> routeSheetEmployees)

View File

@ -1,4 +1,6 @@
namespace TransportEnterprise.Entities;
using System.ComponentModel;
namespace TransportEnterprise.Entities;
public class RouteSheet_Employee
{

View File

@ -52,14 +52,14 @@
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 62;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(1113, 832);
dataGridView.Size = new Size(1661, 832);
dataGridView.TabIndex = 3;
//
// panel1
//
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(1119, 0);
panel1.Location = new Point(1667, 0);
panel1.Name = "panel1";
panel1.Size = new Size(194, 832);
panel1.TabIndex = 2;
@ -79,7 +79,7 @@
//
AutoScaleDimensions = new SizeF(10F, 25F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1313, 832);
ClientSize = new Size(1861, 832);
Controls.Add(dataGridView);
Controls.Add(panel1);
Name = "FormAddingRouteSheet";

View File

@ -43,19 +43,9 @@ public partial class FormAddingRouteSheet : Form
}
private void LoadList() {
var data = _routeSheetRepository.ReadRouteSheets();
var data1 = _routeSheetRepository.ReadRouteSheets_Employee();
var filteredData = data.Select(rs => new
{
rs.Id,
rs.BusId,
rs.RouteId,
dataGridView.DataSource = data;
dataGridView.Columns["Id"].Visible = false;
}).ToList();
dataGridView.DataSource = filteredData;
}
}

View File

@ -90,7 +90,11 @@ namespace TransportEnterprise.Forms
}
private void LoadList() => dataGridView.DataSource = _busRepository.ReadBuses();
private void LoadList() {
dataGridView.DataSource = _busRepository.ReadBuses();
dataGridView.Columns["Id"].Visible = false;
dataGridView.Columns["BusDisplayName"].Visible = false;
}
private bool TryGetIdentifierFromSelectedRow(out int id)
{

View File

@ -75,7 +75,11 @@ public partial class FormEmployees : Form
MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridView.DataSource = _employeeRepository.ReadEmployees();
private void LoadList()
{
dataGridView.DataSource = _employeeRepository.ReadEmployees();
dataGridView.Columns["Id"].Visible = false;
}
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;

View File

@ -66,7 +66,7 @@
comboBoxBus.FormattingEnabled = true;
comboBoxBus.Location = new Point(242, 35);
comboBoxBus.Name = "comboBoxBus";
comboBoxBus.Size = new Size(300, 33);
comboBoxBus.Size = new Size(350, 33);
comboBoxBus.TabIndex = 17;
//
// comboBoxEmployee
@ -75,14 +75,14 @@
comboBoxEmployee.FormattingEnabled = true;
comboBoxEmployee.Location = new Point(242, 363);
comboBoxEmployee.Name = "comboBoxEmployee";
comboBoxEmployee.Size = new Size(300, 33);
comboBoxEmployee.Size = new Size(350, 33);
comboBoxEmployee.TabIndex = 15;
//
// dateTimePicker
//
dateTimePicker.Location = new Point(242, 276);
dateTimePicker.Name = "dateTimePicker";
dateTimePicker.Size = new Size(300, 31);
dateTimePicker.Size = new Size(350, 31);
dateTimePicker.TabIndex = 14;
//
// labelBus
@ -126,7 +126,7 @@
checkedListBoxBreakDownType.FormattingEnabled = true;
checkedListBoxBreakDownType.Location = new Point(242, 114);
checkedListBoxBreakDownType.Name = "checkedListBoxBreakDownType";
checkedListBoxBreakDownType.Size = new Size(300, 144);
checkedListBoxBreakDownType.Size = new Size(350, 144);
checkedListBoxBreakDownType.TabIndex = 21;
//
// FormRepairRequest

View File

@ -14,7 +14,7 @@ public partial class FormRepairRequest : Form
InitializeComponent();
_repairRequestRepository = repairRequestRepository ?? throw new ArgumentNullException(nameof(repairRequestRepository));
comboBoxBus.DataSource = busRepository.ReadBuses();
comboBoxBus.DisplayMember = "LicensePlate";
comboBoxBus.DisplayMember = "BusDisplayName";
comboBoxBus.ValueMember = "Id";
comboBoxEmployee.DataSource = employeeRepository.ReadEmployees();

View File

@ -52,14 +52,14 @@
dataGridView.RowHeadersVisible = false;
dataGridView.RowHeadersWidth = 62;
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
dataGridView.Size = new Size(1091, 894);
dataGridView.Size = new Size(1306, 894);
dataGridView.TabIndex = 5;
//
// panel1
//
panel1.Controls.Add(buttonAdd);
panel1.Dock = DockStyle.Right;
panel1.Location = new Point(1091, 0);
panel1.Location = new Point(1306, 0);
panel1.Name = "panel1";
panel1.Size = new Size(187, 894);
panel1.TabIndex = 4;
@ -79,7 +79,7 @@
//
AutoScaleDimensions = new SizeF(10F, 25F);
AutoScaleMode = AutoScaleMode.Font;
ClientSize = new Size(1278, 894);
ClientSize = new Size(1493, 894);
Controls.Add(dataGridView);
Controls.Add(panel1);
Name = "FormRepairRequests";

View File

@ -36,8 +36,13 @@ namespace TransportEnterprise.Forms
MessageBox.Show(ex.Message, "Ошибка при добавлении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridView.DataSource = _repairRequestRepository.ReadRepairRequests();
private void LoadList()
{
dataGridView.DataSource = _repairRequestRepository.ReadRepairRequests();
dataGridView.Columns["DateTime"].DefaultCellStyle.Format = "dd.MM.yyyy";
dataGridView.Columns["Id"].Visible = false;
}
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;

View File

@ -12,7 +12,7 @@ public partial class FormRouteSheet : Form
InitializeComponent();
_routeSheetRepository = routeSheetRepository ?? throw new ArgumentNullException(nameof(routeSheetRepository));
comboBoxRoute.DataSource = routeRepository.ReadRoutes();
comboBoxRoute.DisplayMember = "Name";
comboBoxRoute.DisplayMember = "RouteDisplayName";
comboBoxRoute.ValueMember = "Id";
ColumnName.DataSource = employeeRepository.ReadEmployees();
@ -21,7 +21,7 @@ public partial class FormRouteSheet : Form
comboBoxBus.DataSource = busRepository.ReadBuses();
comboBoxBus.DisplayMember = "LicensePlate";
comboBoxBus.DisplayMember = "BusDisplayName";
comboBoxBus.ValueMember = "Id";
}
private void buttonSave_Click(object sender, EventArgs e)

View File

@ -127,7 +127,7 @@
buttonMakeReport.UseVisualStyleBackColor = true;
buttonMakeReport.Click += buttonMakeReport_Click;
//
// RouteSheetEmployeeReport
// FormRouteSheetEmployeeReport
//
AutoScaleDimensions = new SizeF(10F, 25F);
AutoScaleMode = AutoScaleMode.Font;
@ -142,8 +142,8 @@
Controls.Add(labelStartDate);
Controls.Add(labelEmployee);
Controls.Add(labelSelectFile);
Name = "RouteSheetEmployeeReport";
Text = "RouteSheetEmployeeReport";
Name = "FormRouteSheetEmployeeReport";
Text = "Отчёт по работникам";
ResumeLayout(false);
PerformLayout();
}

View File

@ -80,7 +80,7 @@
buttonCreate.UseVisualStyleBackColor = true;
buttonCreate.Click += buttonCreate_Click;
//
// RouteSheetEmployeesDistributionReport
// FormRouteSheetEmployeesDistributionReport
//
AutoScaleDimensions = new SizeF(10F, 25F);
AutoScaleMode = AutoScaleMode.Font;
@ -90,8 +90,8 @@
Controls.Add(labelDate);
Controls.Add(labelFileName);
Controls.Add(buttonSelectFileName);
Name = "RouteSheetEmployeesDistributionReport";
Text = "RouteSheetEmployeesDistributionReport";
Name = "FormRouteSheetEmployeesDistributionReport";
Text = "Отчёт по среди работников";
ResumeLayout(false);
PerformLayout();
}

View File

@ -75,7 +75,12 @@ public partial class FormRoutes : Form
MessageBox.Show(ex.Message, "Ошибка при удалении", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadList() => dataGridView.DataSource = _routeRepository.ReadRoutes();
private void LoadList()
{
dataGridView.DataSource = _routeRepository.ReadRoutes();
dataGridView.Columns["Id"].Visible = false;
dataGridView.Columns["RouteDisplayName"].Visible=false;
}
private bool TryGetIdentifierFromSelectedRow(out int id)
{
id = 0;

View File

@ -23,7 +23,7 @@ internal class ChartReport
{
new PdfBuilder(filePath)
.AddHeader("Рейсы работников")
.AddPieChart("Работники", GetData(dateTime))
.AddPieChart($"Работники { dateTime:dd MMMM yyyy}", GetData(dateTime))
.Build();
return true;
}
@ -36,8 +36,7 @@ internal class ChartReport
private List<(string Caption, double Value)> GetData(DateTime dateTime)
{
var routeSheets = _routeSheetRepository.ReadRouteSheets()
.Where(x => x.DateTime.Date == dateTime.Date) .ToList();
var routeSheets = _routeSheetRepository.ReadRouteSheets(dateFrom:dateTime).ToList();
var routeSheetEmployees = _routeSheetRepository.ReadRouteSheets_Employee();

View File

@ -25,7 +25,7 @@ internal class TableReport
var data = GetData(employeeId, startDate, endDate);
new ExcelBuilder(filePath)
.AddHeader("Сводка по движению рейсов", 0, 2)
.AddParagraph("за период", 0)
.AddParagraph($"за период c {startDate: dd MMMM yyyy} по {endDate: dd MMMM yyyy}", 0)
.AddTable([10, 15, 15], data)
.Build();
return true;
@ -39,17 +39,15 @@ internal class TableReport
private List<string[]> GetData(int employeeId, DateTime startDate, DateTime endDate)
{
var routeSheets = _routeSheetRepository.ReadRouteSheets()
.Where(x => x.DateTime >= startDate && x.DateTime <= endDate)
var routeSheets = _routeSheetRepository.ReadRouteSheets(dateFrom:startDate, dateTo:endDate)
.ToList();
var routeSheetEmployees = _routeSheetRepository.ReadRouteSheets_Employee()
.Where(x => x.EmployeeId == employeeId)
var routeSheetEmployees = _routeSheetRepository.ReadRouteSheets_Employee(employeeId:employeeId)
.ToList();
var Employee = _employeeRepository.ReadEmployeeById(employeeId);
var data1 = from x in routeSheets
var data = from x in routeSheets
join y in routeSheetEmployees on x.Id equals y.RouteSheetId
select new
{
@ -58,7 +56,7 @@ internal class TableReport
Count = y.Count
};
var groupedData = data1
var groupedData = data
.GroupBy(x => new { x.Name, x.Date })
.Select(g => new
{
@ -73,7 +71,7 @@ internal class TableReport
var result = new List<string[]>() { item }
.Union(
data1
data
.Select(x => new string[] {
x.Name.ToString(), x.Date.ToString(), x.Count.ToString()
}))

View File

@ -1,9 +1,9 @@
namespace TransportEnterprise.Entities.Repositories;
public interface IRouteSheetRepository
{
IEnumerable<RouteSheet> ReadRouteSheets();
IEnumerable<RouteSheet> ReadRouteSheets(DateTime? dateFrom = null, DateTime? dateTo = null);
RouteSheet ReadRouteSheeteById(int id);
IEnumerable<RouteSheet_Employee> ReadRouteSheets_Employee();
IEnumerable<RouteSheet_Employee> ReadRouteSheets_Employee(int? employeeId =null);
void CreateRouteSheet(RouteSheet routeSheet);
void UpdateRouteSheet(RouteSheet routeSheet);
void DeleteRouteSheet(int id);

View File

@ -0,0 +1,26 @@
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}";
}
}

View File

@ -68,7 +68,15 @@ public class RepairRequestRepository : IRepairRequestRepository
{
using var connection = new
NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM RepairRequest";
var querySelect =
@"SELECT
rr.*,
CONCAT(b.Brand, ' ', b.Model, ' ', b.LicensePlate) as BusName,
e.name as EmployeeName
FROM RepairRequest rr
LEFT JOIN Employee e ON e.Id = rr.EmployeeId
LEFT JOIN Bus b ON b.Id = rr.BusId
";
var repairRequests = connection.Query<RepairRequest>(querySelect);
_logger.LogDebug("Полученные объекты: {json}",
JsonConvert.SerializeObject(repairRequests));

View File

@ -123,15 +123,43 @@ public class RouteSheetRepository : IRouteSheetRepository
}
}
public IEnumerable<RouteSheet> ReadRouteSheets()
public IEnumerable<RouteSheet> ReadRouteSheets(DateTime? dateFrom = null, DateTime? dateTo =null)
{
_logger.LogInformation("Получение всех объектов");
try
{
var builder = new QueryBuilder();
if (dateFrom.HasValue && !dateTo.HasValue)
{
builder.AddCondition("rs.DateTime >= @dateFrom");
builder.AddCondition("rs.DateTime <= @dateTo");
dateFrom = dateFrom.Value.Date;
dateTo = dateFrom.Value.Date.AddDays(1);
}
else if (dateFrom.HasValue)
{
builder.AddCondition("rs.DateTime >= @dateFrom");
}
if (dateTo.HasValue)
{
builder.AddCondition("rs.DateTime <= @dateTo");
}
using var connection = new
NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM RouteSheet";
var routeSheets = connection.Query<RouteSheet>(querySelect);
var querySelect = $@"SELECT
rs.*,
CONCAT(b.Brand, ' ', b.Model, ' ', b.LicensePlate) as BusName,
CONCAT(r.Number, ' ', r.Name) as RouteName,
CONCAT(e.Name, ' ', rse.Count, ' рейсов') as Employee
FROM RouteSheet rs
LEFT JOIN RouteSheet_Employee rse ON rse.RouteSheetId = rs.Id
LEFT JOIN Employee e ON e.Id = rse.EmployeeId
LEFT JOIN Bus b ON b.Id = rs.BusId
LEFT JOIN Route r ON r.Id = rs.RouteId
{builder.Build()}";
var routeSheets = connection.Query<RouteSheet>(querySelect, new {dateFrom,dateTo});
_logger.LogDebug("Полученные объекты: {json}",
JsonConvert.SerializeObject(routeSheets));
return routeSheets;
@ -143,15 +171,22 @@ public class RouteSheetRepository : IRouteSheetRepository
}
}
public IEnumerable<RouteSheet_Employee> ReadRouteSheets_Employee()
public IEnumerable<RouteSheet_Employee> ReadRouteSheets_Employee(int? employeeId = null)
{
_logger.LogInformation("Получение всех объектов");
try
{
var builder = new QueryBuilder();
if (employeeId.HasValue)
{
builder.AddCondition("rse.EmployeeId = @employeeId");
}
using var connection = new
NpgsqlConnection(_connectionString.ConnectionString);
var querySelect = "SELECT * FROM RouteSheet_Employee";
var routeSheets = connection.Query<RouteSheet_Employee>(querySelect);
var querySelect = $@"SELECT rse.*
FROM RouteSheet_Employee rse
{builder.Build()}";
var routeSheets = connection.Query<RouteSheet_Employee>(querySelect, new {employeeId});
_logger.LogDebug("Полученные объекты: {json}",
JsonConvert.SerializeObject(routeSheets));
return routeSheets;