Лабораторная работа №4
This commit is contained in:
parent
79ed7aa78b
commit
527491a7e7
@ -1,4 +1,5 @@
|
||||
using ProjectOptika.Scripts.Entities.Enums;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace ProjectOptika.Scripts.Entities
|
||||
{
|
||||
@ -6,18 +7,25 @@ namespace ProjectOptika.Scripts.Entities
|
||||
{
|
||||
public int ID { get; private set; }
|
||||
|
||||
[DisplayName("Название")]
|
||||
public string Name { get; private set; }
|
||||
|
||||
[DisplayName("Название бренда")]
|
||||
public string Brand { get; private set; }
|
||||
|
||||
[DisplayName("Стоимость")]
|
||||
public int Cost { get; private set; }
|
||||
|
||||
[DisplayName("Количество на складе")]
|
||||
public int StockAvailability { get; private set; }
|
||||
|
||||
[DisplayName("Количество в магазине")]
|
||||
public int AvailabilityStore { get; private set; }
|
||||
|
||||
[DisplayName("Дата поставки")]
|
||||
public DateTime DeliveryDate { get; private set; }
|
||||
|
||||
[DisplayName("Категория")]
|
||||
public CategoryType CategoryName { get; private set; }
|
||||
|
||||
public static Accessories CreateEntity(int id, string name, string brand, int cost, int stockAvailability, int availabilityStore, DateTime deliveryDate, CategoryType categoryName)
|
||||
|
@ -8,13 +8,16 @@
|
||||
|
||||
public int Count { get; private set; }
|
||||
|
||||
public static AccessoriesOrder CreateElement(int id, int accesoryId, int count)
|
||||
public string AccessoryName { get; private set; } = string.Empty;
|
||||
|
||||
public static AccessoriesOrder CreateElement(int id, int accesoryId, int count, string? accessoryName = null)
|
||||
{
|
||||
return new AccessoriesOrder
|
||||
{
|
||||
ID = id,
|
||||
AccesoryId = accesoryId,
|
||||
Count = count
|
||||
Count = count,
|
||||
AccessoryName = accessoryName
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,5 @@
|
||||
using ProjectOptika.Scripts.Entities.Enums;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace ProjectOptika.Scripts.Entities
|
||||
{
|
||||
@ -6,16 +7,23 @@ namespace ProjectOptika.Scripts.Entities
|
||||
{
|
||||
public int ID { get; private set; }
|
||||
|
||||
[DisplayName("Тип клиента")]
|
||||
public ClientType ClientType { get; private set; }
|
||||
|
||||
[DisplayName("Имя")]
|
||||
public string FirstName { get; private set; }
|
||||
|
||||
[DisplayName("Отчество")]
|
||||
public string SecondName { get; private set; }
|
||||
|
||||
[DisplayName("Фамилия")]
|
||||
public string Surname { get; private set; }
|
||||
|
||||
[DisplayName("Номер телефона")]
|
||||
public string PhoneNumber { get; private set; }
|
||||
|
||||
public string FullName => $"{FirstName} {SecondName} {Surname}";
|
||||
|
||||
public static Client CreateEntity(int id, ClientType clientType, string firstName, string secondName, string surname, string phoneNumber)
|
||||
{
|
||||
return new Client
|
||||
|
@ -1,4 +1,5 @@
|
||||
using ProjectOptika.Scripts.Entities.Enums;
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace ProjectOptika.Scripts.Entities
|
||||
{
|
||||
@ -6,14 +7,20 @@ namespace ProjectOptika.Scripts.Entities
|
||||
{
|
||||
public int ID { get; private set; }
|
||||
|
||||
[DisplayName("Тип сотрудника")]
|
||||
public PositionEmployee PositionEmployee { get; private set; }
|
||||
|
||||
[DisplayName("Имя")]
|
||||
public string FirstName { get; private set; }
|
||||
|
||||
[DisplayName("Отчество")]
|
||||
public string SecondName { get; private set; }
|
||||
|
||||
[DisplayName("Фамилия")]
|
||||
public string Surname { get; private set; }
|
||||
|
||||
public string FullName => $"{FirstName} {SecondName} {Surname}";
|
||||
|
||||
public static Employee CreateEntity(int id, PositionEmployee positionEmployee, string firstName, string secondName, string surname) {
|
||||
return new Employee
|
||||
{
|
||||
|
@ -1,19 +1,45 @@
|
||||
namespace ProjectOptika.Scripts.Entities
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace ProjectOptika.Scripts.Entities
|
||||
{
|
||||
public class Order
|
||||
{
|
||||
public int ID { get; private set; }
|
||||
|
||||
[Browsable(false)]
|
||||
public int EmployeeID { get; private set; }
|
||||
|
||||
[Browsable(false)]
|
||||
public int ClientID { get; private set; }
|
||||
|
||||
[DisplayName("Дата заказа")]
|
||||
public DateTime OrderDate { get; private set; }
|
||||
|
||||
[DisplayName("Общая стоимость")]
|
||||
public double TotalCost { get; private set; }
|
||||
|
||||
[DisplayName("Клиент")]
|
||||
public string ClientFullName { get; private set; }
|
||||
|
||||
[DisplayName("Работник")]
|
||||
public string EmployeeFullName { get; private set; }
|
||||
|
||||
[DisplayName("Заказ")]
|
||||
public string AccessoryOrder => AccesoriesOrders != null ?
|
||||
string.Join(", ", AccesoriesOrders.Select(x => x != null ? $"{x.AccessoryName} {x.Count}" : string.Empty)) :
|
||||
string.Empty;
|
||||
|
||||
[Browsable(false)]
|
||||
public IEnumerable<AccessoriesOrder> AccesoriesOrders { get; private set; } = [];
|
||||
|
||||
public void SetAccessriesOrderReplenishment(IEnumerable<AccessoriesOrder> accesoriesOrders)
|
||||
{
|
||||
if (accesoriesOrders != null && accesoriesOrders.Any())
|
||||
{
|
||||
AccesoriesOrders = accesoriesOrders;
|
||||
}
|
||||
}
|
||||
|
||||
public static Order CreateOperation(int id, int employeeID, int clientID, double totalCost, IEnumerable<AccessoriesOrder> accesoriesOrders)
|
||||
{
|
||||
return new Order {
|
||||
|
@ -1,19 +1,30 @@
|
||||
namespace ProjectOptika.Scripts.Entities
|
||||
using System.ComponentModel;
|
||||
|
||||
namespace ProjectOptika.Scripts.Entities
|
||||
{
|
||||
public class Specifications
|
||||
{
|
||||
public int ID { get; private set; }
|
||||
|
||||
[Browsable(false)]
|
||||
public int AccessoriesID { get; private set; }
|
||||
|
||||
[DisplayName("Наименование аксессуара")]
|
||||
public string AccessoriesName { get; private set; }
|
||||
|
||||
[DisplayName("Материал")]
|
||||
public string Material { get; private set; }
|
||||
|
||||
[DisplayName("Астигматизм")]
|
||||
public string Astigmatism { get; private set; }
|
||||
|
||||
[DisplayName("Диоптрийность")]
|
||||
public string Dioptericity { get; private set; }
|
||||
|
||||
[DisplayName("Страна изготовителя")]
|
||||
public string OriginCountry { get; private set; }
|
||||
|
||||
[DisplayName("Время производства")]
|
||||
public double TimeProduction { get; private set; }
|
||||
|
||||
public static Specifications CreateEntity(int id, int accessoriesID, string material, string astigmatism, string dioptericity, string originCountry, double timeProduction)
|
||||
|
@ -79,7 +79,11 @@ namespace ProjectOptika.Scripts.Forms
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadList() => dataGridView.DataSource = _accessoriesRepositories.GetAccessories();
|
||||
private void LoadList()
|
||||
{
|
||||
dataGridView.DataSource = _accessoriesRepositories.GetAccessories();
|
||||
dataGridView.Columns["ID"].Visible = false;
|
||||
}
|
||||
|
||||
private bool TryGetIdentifierFromSelectedRows(out int id)
|
||||
{
|
||||
|
@ -79,7 +79,12 @@ namespace ProjectOptika.Scripts.Forms
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadList() => dataGridView.DataSource = _clientRepositories.GetClients();
|
||||
private void LoadList()
|
||||
{
|
||||
dataGridView.DataSource = _clientRepositories.GetClients();
|
||||
dataGridView.Columns["ID"].Visible = false;
|
||||
dataGridView.Columns["FullName"].Visible = false;
|
||||
}
|
||||
|
||||
private bool TryGetIdentifierFromSelectedRows(out int id)
|
||||
{
|
||||
|
@ -79,7 +79,12 @@ namespace ProjectOptika.Scripts.Forms
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadList() => dataGridView.DataSource = _employeeRepositories.GetEmployees();
|
||||
private void LoadList()
|
||||
{
|
||||
dataGridView.DataSource = _employeeRepositories.GetEmployees();
|
||||
dataGridView.Columns["ID"].Visible = false;
|
||||
dataGridView.Columns["FullName"].Visible = false;
|
||||
}
|
||||
|
||||
private bool TryGetIdentifierFromSelectedRows(out int id)
|
||||
{
|
||||
|
@ -15,11 +15,11 @@ namespace ProjectOptika.Scripts.Forms
|
||||
throw new ArgumentNullException(nameof(orderRepository));
|
||||
|
||||
comboBoxEmployee.DataSource = employeeRepository.GetEmployees();
|
||||
comboBoxEmployee.DisplayMember = "Surname";
|
||||
comboBoxEmployee.DisplayMember = "FullName";
|
||||
comboBoxEmployee.ValueMember = "ID";
|
||||
|
||||
comboBoxClient.DataSource = clientRepositiory.GetClients();
|
||||
comboBoxClient.DisplayMember = "Surname";
|
||||
comboBoxClient.DisplayMember = "FullName";
|
||||
comboBoxClient.ValueMember = "ID";
|
||||
|
||||
ColumnAccessory.DataSource = accessoriesRepository.GetAccessories();
|
||||
|
@ -76,7 +76,7 @@
|
||||
dataGridView.AllowUserToResizeRows = false;
|
||||
dataGridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
|
||||
dataGridView.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
|
||||
dataGridView.Dock = DockStyle.Fill;
|
||||
dataGridView.Dock = DockStyle.Left;
|
||||
dataGridView.Location = new Point(0, 0);
|
||||
dataGridView.MultiSelect = false;
|
||||
dataGridView.Name = "dataGridView";
|
||||
@ -84,7 +84,7 @@
|
||||
dataGridView.RowHeadersVisible = false;
|
||||
dataGridView.RowHeadersWidth = 51;
|
||||
dataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
|
||||
dataGridView.Size = new Size(800, 450);
|
||||
dataGridView.Size = new Size(693, 450);
|
||||
dataGridView.TabIndex = 9;
|
||||
//
|
||||
// FormItemOrders
|
||||
|
@ -30,8 +30,12 @@ namespace ProjectOptika.Scripts.Forms
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadList() => dataGridView.DataSource =
|
||||
_orderRepository.GetOrders();
|
||||
private void LoadList()
|
||||
{
|
||||
dataGridView.DataSource = _orderRepository.GetOrders();
|
||||
dataGridView.Columns["ID"].Visible = false;
|
||||
dataGridView.Columns["OrderDate"].DefaultCellStyle.Format = "dd MM yyyy";
|
||||
}
|
||||
|
||||
private bool TryGetIdentifierFromSelectedRow(out int id)
|
||||
{
|
||||
|
@ -79,7 +79,11 @@ namespace ProjectOptika.Scripts.Forms
|
||||
}
|
||||
}
|
||||
|
||||
private void LoadList() => dataGridView.DataSource = _specificationRepositories.GetSpecifications();
|
||||
private void LoadList()
|
||||
{
|
||||
dataGridView.DataSource = _specificationRepositories.GetSpecifications();
|
||||
dataGridView.Columns["ID"].Visible = false;
|
||||
}
|
||||
|
||||
private bool TryGetIdentifierFromSelectedRows(out int id)
|
||||
{
|
||||
|
@ -21,7 +21,7 @@ namespace ProjectOptika.Scripts.Reports
|
||||
{
|
||||
new PdfBuilder(filePath)
|
||||
.AddHeader("Учет оплат клиентов")
|
||||
.AddPieChart($"Оплаты клиентов", GetData(dateTime))
|
||||
.AddPieChart($"Оплаты клиентов за {dateTime: dd MMMM yyyy}", GetData(dateTime))
|
||||
.Build();
|
||||
return true;
|
||||
}
|
||||
@ -33,18 +33,12 @@ namespace ProjectOptika.Scripts.Reports
|
||||
}
|
||||
private List<(string Caption, double Value)> GetData(DateTime dateTime)
|
||||
{
|
||||
var orders = _orderRepository.GetOrders()
|
||||
.Where(x => x.OrderDate.Date == dateTime.Date)
|
||||
.ToList();
|
||||
|
||||
var totalCosts = orders.Count;
|
||||
|
||||
return orders
|
||||
.GroupBy(x => x.ClientID, (key, group) => new {
|
||||
ClientID = key,
|
||||
return _orderRepository.GetOrders(startDate: dateTime.Date, endDate: dateTime.Date.AddDays(1))
|
||||
.GroupBy(x => x.ClientFullName, (key, group) => new {
|
||||
Client = key,
|
||||
Count = group.Sum(x => x.TotalCost)
|
||||
})
|
||||
.Select(x => (x.ClientID.ToString(), (double)x.Count / totalCosts * 100))
|
||||
.Select(x => (x.Client, (double)x.Count))
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
@ -27,7 +27,7 @@ namespace ProjectOptika.Scripts.Reports
|
||||
{
|
||||
new ExcelBuilder(filePath)
|
||||
.AddHeader("Сводка по заказам", 0, 4)
|
||||
.AddParagraph("за период", 0)
|
||||
.AddParagraph($"за период c {startDate: dd.MM.yyyy} по {endDate:dd.MM.yyyy}", 0)
|
||||
.AddTable([15, 20, 25], GetData(emplyeeID, startDate, endDate))
|
||||
.Build();
|
||||
return true;
|
||||
@ -39,11 +39,11 @@ namespace ProjectOptika.Scripts.Reports
|
||||
}
|
||||
}
|
||||
|
||||
private List<string[]> GetData(int emplyeeID, DateTime startDate, DateTime endDate)
|
||||
private List<string[]> GetData(int employeeID, DateTime startDate, DateTime endDate)
|
||||
{
|
||||
var orders = _orderRepository.GetOrders(startDate, endDate);
|
||||
var orders = _orderRepository.GetOrders(startDate: startDate, endDate: endDate, employeeID: employeeID);
|
||||
var employees = _employeeRepository.GetEmployees();
|
||||
var employeesNames = _employeeRepository.GetEmployees().ToDictionary(d => d.ID, d => d.Surname);
|
||||
var employeesNames = _employeeRepository.GetEmployees().ToDictionary(d => d.ID, d => d.FullName);
|
||||
var clientsNames = _clientRepositiory.GetClients().ToList();
|
||||
|
||||
var data = orders
|
||||
@ -54,7 +54,6 @@ namespace ProjectOptika.Scripts.Reports
|
||||
ClientID = r.ClientID,
|
||||
TotalCost = r.TotalCost
|
||||
})
|
||||
.Where(x => x.EmployeeID == emplyeeID)
|
||||
.OrderBy(x => x.Date)
|
||||
.GroupBy(x => x.Date)
|
||||
.Select(g => new
|
||||
@ -70,7 +69,7 @@ namespace ProjectOptika.Scripts.Reports
|
||||
result.Add(new string[]
|
||||
{
|
||||
entry.Date.ToString("dd.MM.yyyy"),
|
||||
employeesNames.ContainsKey(emplyeeID) ? employeesNames[emplyeeID] : string.Empty,
|
||||
employeesNames.ContainsKey(employeeID) ? employeesNames[employeeID] : string.Empty,
|
||||
entry.Totals.ToString(),
|
||||
});
|
||||
}
|
||||
|
@ -85,13 +85,73 @@ namespace ProjectOptika.Scripts.Repositories.Implementations
|
||||
_logger.LogInformation("Получение всех объектов");
|
||||
try
|
||||
{
|
||||
var builder = new QueryBuilder();
|
||||
|
||||
if (startDate.HasValue)
|
||||
{
|
||||
builder.AddCondition("z.OrderDate >= @startDate");
|
||||
}
|
||||
if (endDate.HasValue)
|
||||
{
|
||||
builder.AddCondition("z.OrderDate <= @endDate");
|
||||
}
|
||||
if (id.HasValue)
|
||||
{
|
||||
builder.AddCondition("z.ID = @id");
|
||||
}
|
||||
if (employeeID.HasValue)
|
||||
{
|
||||
builder.AddCondition("z.EmployeeID = @employeeID");
|
||||
}
|
||||
if (clientID.HasValue)
|
||||
{
|
||||
builder.AddCondition("z.ClientID = @clientID");
|
||||
}
|
||||
if (totalCost.HasValue)
|
||||
{
|
||||
builder.AddCondition("z.TotalCost = @totalCost");
|
||||
}
|
||||
|
||||
using var connection = new NpgsqlConnection(_connectionString.ConnectionString);
|
||||
var querySelect = @"SELECT * FROM Zakaz";
|
||||
var orders =
|
||||
connection.Query<Order>(querySelect);
|
||||
_logger.LogDebug("Полученные объекты: {json}",
|
||||
JsonConvert.SerializeObject(orders));
|
||||
return orders;
|
||||
var querySelect = @$"
|
||||
SELECT
|
||||
z.*,
|
||||
CONCAT(c.Surname, ' ', c.FirstName) as ClientFullName,
|
||||
CONCAT(e.Surname, ' ', e.FirstName) as EmployeeFullName,
|
||||
|
||||
a.Name as AccessoryName,
|
||||
ao.AccessoriesID,
|
||||
ao.Count
|
||||
|
||||
FROM Zakaz z
|
||||
LEFT JOIN Client c ON c.ID = z.ClientID
|
||||
LEFT JOIN Employee e ON e.ID = z.EmployeeID
|
||||
|
||||
INNER JOIN AccessoriesOrder ao ON ao.ZakazID = z.ID
|
||||
LEFT JOIN Accessories a ON a.ID = ao.AccessoriesID
|
||||
{builder.Build()}";
|
||||
var orderHelperDict = new Dictionary<int, List<AccessoriesOrder>>();
|
||||
var orderes = new Dictionary<int, List<Order>>();
|
||||
var orders = connection.Query<Order, AccessoriesOrder, Order>(querySelect,
|
||||
(order, accessoriesOrders) =>
|
||||
{
|
||||
if (!orderHelperDict.TryGetValue(order.ID, out var z))
|
||||
{
|
||||
z = new List<AccessoriesOrder>();
|
||||
orderHelperDict.Add(order.ID, z);
|
||||
}
|
||||
z.Add(accessoriesOrders);
|
||||
return order;
|
||||
}, splitOn: "AccessoryName", param: new { startDate, endDate, totalCost, id, employeeID, clientID });
|
||||
|
||||
_logger.LogDebug("Полученные объекты: {json}", JsonConvert.SerializeObject(orders));
|
||||
|
||||
return orderHelperDict.Select(x =>
|
||||
{
|
||||
var r = orders.First(y => y.ID == x.Key);
|
||||
r.SetAccessriesOrderReplenishment(x.Value);
|
||||
return r;
|
||||
}).ToArray();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
27
ProjectOptika/Scripts/Repositories/QueryBuilder.cs
Normal file
27
ProjectOptika/Scripts/Repositories/QueryBuilder.cs
Normal file
@ -0,0 +1,27 @@
|
||||
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}";
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user