Nov2611/_2Menu.cs
2025-11-26 16:13:12 +04:00

421 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace NeshinaPolina07_11
{
public partial class _2Menu : Form
{
private const string MODE_PRODUCTS = "PRODUCTS";
private const string MODE_ORDERS = "ORDERS";
private string currentMode = MODE_PRODUCTS;
public _2Menu()
{
InitializeComponent();
InitializeSortComboBox();
LoadSuppliers();
this.Text = "Менеджер";
}
private void InitializeSortComboBox()
{
cmbSort.Items.Clear();
cmbSort.Items.Add("Без сортировки");
cmbSort.Items.Add("По возрастанию (остаток)");
cmbSort.Items.Add("По убыванию (остаток)");
cmbSort.SelectedIndex = 0;
}
private void LoadSuppliers()
{
cmbSupplier.Items.Clear();
cmbSupplier.Items.Add(new SupplierItem { Name = "Все поставщики", Id = -1 });
try
{
var db = DB.GetInstance();
var connection = db.GetConnection();
string query = "SELECT supplier_id, supplier_name FROM suppliers ORDER BY supplier_name";
using (MySqlCommand cmd = new MySqlCommand(query, connection))
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
int id = Convert.ToInt32(reader["supplier_id"]);
string name = reader["supplier_name"].ToString();
cmbSupplier.Items.Add(new SupplierItem { Id = id, Name = name });
}
}
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки поставщиков: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
cmbSupplier.DisplayMember = "Name";
cmbSupplier.ValueMember = "Id";
cmbSupplier.SelectedIndex = 0;
}
private class SupplierItem
{
public int Id { get; set; }
public string Name { get; set; }
public override string ToString() => Name;
}
private void SwitchMode(string mode)
{
currentMode = mode;
if (mode == MODE_PRODUCTS)
{
lblSort.Visible = true;
cmbSort.Visible = true;
lblSupplier.Visible = true;
cmbSupplier.Visible = true;
LoadProductsData(txtSearch.Text, cmbSort.SelectedItem?.ToString() ?? "Без сортировки", GetSelectedSupplierId());
}
else if (mode == MODE_ORDERS)
{
lblSort.Visible = false;
cmbSort.Visible = false;
lblSupplier.Visible = false;
cmbSupplier.Visible = false;
LoadOrdersData(txtSearch.Text);
}
}
private void LoadProductsData(string searchQuery = "", string sortOption = "Без сортировки", int? supplierId = null)
{
try
{
var db = DB.GetInstance();
var connection = db.GetConnection();
string query = @"
SELECT
p.product_id,
p.product_article,
p.product_name,
p.unit,
p.price,
p.discount,
p.quantity_in_stock,
p.description,
p.photo,
c.category_name AS category,
m.manufacturer_name AS manufacturer,
s.supplier_name AS supplier
FROM products p
LEFT JOIN categories c ON p.category_id = c.category_id
LEFT JOIN manufacturers m ON p.manufacturer_id = m.manufacturer_id
LEFT JOIN suppliers s ON p.supplier_id = s.supplier_id";
var conditions = new List<string>();
var parameters = new List<MySqlParameter>();
if (!string.IsNullOrWhiteSpace(searchQuery))
{
string searchPattern = "%" + searchQuery.Trim().ToLower() + "%";
conditions.Add(@"
LOWER(COALESCE(p.product_article, '')) LIKE @search OR
LOWER(COALESCE(p.product_name, '')) LIKE @search OR
LOWER(COALESCE(p.unit, '')) LIKE @search OR
LOWER(COALESCE(CAST(p.price AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(CAST(p.discount AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(CAST(p.quantity_in_stock AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(p.description, '')) LIKE @search OR
LOWER(COALESCE(p.photo, '')) LIKE @search OR
LOWER(COALESCE(c.category_name, '')) LIKE @search OR
LOWER(COALESCE(m.manufacturer_name, '')) LIKE @search OR
LOWER(COALESCE(s.supplier_name, '')) LIKE @search
");
parameters.Add(new MySqlParameter("@search", searchPattern));
}
if (supplierId.HasValue && supplierId.Value != -1)
{
conditions.Add("p.supplier_id = @supplierId");
parameters.Add(new MySqlParameter("@supplierId", supplierId.Value));
}
if (conditions.Count > 0)
{
query += " WHERE " + string.Join(" AND ", conditions);
}
switch (sortOption)
{
case "По возрастанию (остаток)":
query += " ORDER BY p.quantity_in_stock ASC";
break;
case "По убыванию (остаток)":
query += " ORDER BY p.quantity_in_stock DESC";
break;
}
using (MySqlCommand cmd = new MySqlCommand(query, connection))
{
cmd.Parameters.AddRange(parameters.ToArray());
using (MySqlDataAdapter adapter = new MySqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvProducts.DataSource = dt;
}
}
dgvProducts.AutoResizeColumns();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки данных о товарах: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void LoadOrdersData(string searchQuery = "")
{
try
{
var db = DB.GetInstance();
var connection = db.GetConnection();
string query = @"
SELECT
o.order_id,
o.order_date,
o.delivery_date,
pp.address AS pickup_point, -- Вместо pickup_point_id
u.full_name AS user_name, -- Вместо user_id
o.receive_code,
os.status_name AS status -- Вместо status_id
FROM orders o
LEFT JOIN pickup_points pp ON o.pickup_point_id = pp.point_id
LEFT JOIN users u ON o.user_id = u.user_id
LEFT JOIN order_statuses os ON o.status_id = os.status_id";
var conditions = new List<string>();
var parameters = new List<MySqlParameter>();
if (!string.IsNullOrWhiteSpace(searchQuery))
{
string searchPattern = "%" + searchQuery.Trim().ToLower() + "%";
conditions.Add(@"
LOWER(COALESCE(CAST(o.order_id AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(CAST(o.order_date AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(CAST(o.delivery_date AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(pp.address, '')) LIKE @search OR -- Поиск по названию пункта выдачи
LOWER(COALESCE(u.full_name, '')) LIKE @search OR -- Поиск по имени пользователя
LOWER(COALESCE(o.receive_code, '')) LIKE @search OR
LOWER(COALESCE(os.status_name, '')) LIKE @search -- Поиск по названию статуса
");
parameters.Add(new MySqlParameter("@search", searchPattern));
}
if (conditions.Count > 0)
{
query += " WHERE " + string.Join(" AND ", conditions);
}
using (MySqlCommand cmd = new MySqlCommand(query, connection))
{
cmd.Parameters.AddRange(parameters.ToArray());
using (MySqlDataAdapter adapter = new MySqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvProducts.DataSource = dt;
}
}
dgvProducts.AutoResizeColumns();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки данных о заказах: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void PerformSearch()
{
if (currentMode == MODE_PRODUCTS)
{
LoadProductsData(txtSearch.Text, cmbSort.SelectedItem?.ToString() ?? "Без сортировки", GetSelectedSupplierId());
}
else if (currentMode == MODE_ORDERS)
{
LoadOrdersData(txtSearch.Text);
}
}
private void LoadData(string searchQuery = "", string sortOption = "Без сортировки", int? supplierId = null)
{
try
{
var db = DB.GetInstance();
var connection = db.GetConnection();
string query = @"
SELECT
p.product_id,
p.product_article,
p.product_name,
p.unit,
p.price,
p.discount,
p.quantity_in_stock,
p.description,
p.photo,
c.category_name AS category,
m.manufacturer_name AS manufacturer,
s.supplier_name AS supplier
FROM products p
LEFT JOIN categories c ON p.category_id = c.category_id
LEFT JOIN manufacturers m ON p.manufacturer_id = m.manufacturer_id
LEFT JOIN suppliers s ON p.supplier_id = s.supplier_id";
var conditions = new List<string>();
var parameters = new List<MySqlParameter>();
if (!string.IsNullOrWhiteSpace(searchQuery))
{
string searchPattern = "%" + searchQuery.Trim().ToLower() + "%";
conditions.Add(@"
LOWER(COALESCE(p.product_article, '')) LIKE @search OR
LOWER(COALESCE(p.product_name, '')) LIKE @search OR
LOWER(COALESCE(p.unit, '')) LIKE @search OR
LOWER(COALESCE(CAST(p.price AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(CAST(p.discount AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(CAST(p.quantity_in_stock AS CHAR), '')) LIKE @search OR
LOWER(COALESCE(p.description, '')) LIKE @search OR
LOWER(COALESCE(p.photo, '')) LIKE @search OR
LOWER(COALESCE(c.category_name, '')) LIKE @search OR
LOWER(COALESCE(m.manufacturer_name, '')) LIKE @search OR
LOWER(COALESCE(s.supplier_name, '')) LIKE @search
");
parameters.Add(new MySqlParameter("@search", searchPattern));
}
if (supplierId.HasValue && supplierId.Value != -1)
{
conditions.Add("p.supplier_id = @supplierId");
parameters.Add(new MySqlParameter("@supplierId", supplierId.Value));
}
if (conditions.Count > 0)
{
query += " WHERE " + string.Join(" AND ", conditions);
}
switch (sortOption)
{
case "По возрастанию (остаток)":
query += " ORDER BY p.quantity_in_stock ASC";
break;
case "По убыванию (остаток)":
query += " ORDER BY p.quantity_in_stock DESC";
break;
}
using (MySqlCommand cmd = new MySqlCommand(query, connection))
{
cmd.Parameters.AddRange(parameters.ToArray());
using (MySqlDataAdapter adapter = new MySqlDataAdapter(cmd))
{
DataTable dt = new DataTable();
adapter.Fill(dt);
dgvProducts.DataSource = dt;
}
}
dgvProducts.AutoResizeColumns();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки данных: " + ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
}
private void _2Menu_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e)
{
MainForm form = new MainForm();
form.Show();
this.Hide();
}
private void button3_Click(object sender, EventArgs e)
{
}
private void textBox1_TextChanged(object sender, EventArgs e)
{
PerformSearch();
}
private void cmbSort_SelectedIndexChanged(object sender, EventArgs e)
{
if (currentMode == MODE_PRODUCTS)
{
LoadProductsData(txtSearch.Text, cmbSort.SelectedItem?.ToString() ?? "Без сортировки", GetSelectedSupplierId());
}
}
private void cmbSupplier_SelectedIndexChanged(object sender, EventArgs e)
{
if (currentMode == MODE_PRODUCTS)
{
int? supplierId = GetSelectedSupplierId();
string sort = cmbSort.SelectedItem?.ToString() ?? "Без сортировки";
LoadProductsData(txtSearch.Text, sort, supplierId);
}
}
private int? GetSelectedSupplierId()
{
if (cmbSupplier.SelectedItem is SupplierItem item)
{
return item.Id == -1 ? (int?)null : item.Id;
}
return null;
}
private void _2Menu_FormClosing(object sender, FormClosingEventArgs e)
{
e.Cancel = true;
this.Hide();
MainForm form1 = new MainForm();
form1.Show();
}
private void товарыToolStripMenuItem_Click(object sender, EventArgs e)
{
SwitchMode(MODE_ORDERS);
}
private void заказыToolStripMenuItem_Click(object sender, EventArgs e)
{
SwitchMode(MODE_PRODUCTS);
}
}
}