1703neshinavarfolomeev2/AdminForm.cs
2026-03-17 14:33:47 +04:00

277 lines
11 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 System;
using System.Data;
using System.Drawing;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace Neshina1703
{
public partial class AdminForm : Form
{
private int userId;
private string userName;
private DataTable allProducts;
public AdminForm(int userId, string userName)
{
InitializeComponent();
this.userId = userId;
this.userName = userName;
}
private void AdminForm_Load(object sender, EventArgs e)
{
lblUser.Text = $" {userName}";
LoadSuppliers();
LoadProducts();
LoadOrders();
SetupGrids();
}
private void LoadSuppliers()
{
var suppliers = DB.ExecuteQuery("SELECT DISTINCT supplier_name FROM suppliers ORDER BY supplier_name");
cbFilterSupplier.Items.Clear();
cbFilterSupplier.Items.Add("Все поставщики");
foreach (DataRow row in suppliers.Rows)
cbFilterSupplier.Items.Add(row["supplier_name"].ToString());
cbFilterSupplier.SelectedIndex = 0;
}
private void LoadProducts()
{
try
{
string query = @"SELECT
m.id AS 'ID',
m.medication_name AS 'Название',
CONCAT(m.price, ' ₽') AS 'Цена',
m.stock_quantity AS 'На складе',
m.batch_number AS 'Партия',
s.supplier_name AS 'Поставщик',
ds.status_name AS 'Отпуск',
IF(m.has_analog, '✅', '❌') AS 'Аналог'
FROM medications m
LEFT JOIN suppliers s ON m.supplier_id = s.id
LEFT JOIN dispensing_statuses ds ON m.dispensing_status_id = ds.id
ORDER BY m.medication_name";
allProducts = DB.ExecuteQuery(query);
ApplyFilters();
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки товаров: " + ex.Message, "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void ApplyFilters(object sender = null, EventArgs e = null)
{
if (allProducts == null) return;
DataView view = allProducts.DefaultView;
string filter = "";
if (!string.IsNullOrEmpty(txtSearch.Text.Trim()))
filter += $"Название LIKE '%{txtSearch.Text.Trim()}%'";
if (cbFilterStatus.SelectedIndex > 0)
{
string status = cbFilterStatus.SelectedItem.ToString();
if (!string.IsNullOrEmpty(filter)) filter += " AND ";
filter += $"Отпуск = '{status}'";
}
if (cbFilterSupplier.SelectedIndex > 0)
{
string supplier = cbFilterSupplier.SelectedItem.ToString();
if (!string.IsNullOrEmpty(filter)) filter += " AND ";
filter += $"Поставщик = '{supplier}'";
}
view.RowFilter = filter;
dgvProducts.DataSource = view;
}
private void txtSearch_TextChanged(object sender, EventArgs e) => ApplyFilters();
private void SetupGrids()
{
dgvProducts.Columns["ID"].Visible = false;
dgvProducts.Columns["Цена"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dgvProducts.Columns["На складе"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dgvProducts.Columns["Аналог"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;
dgvProducts.CellFormatting += (s, args) =>
{
if (dgvProducts.Columns[args.ColumnIndex].Name == "На складе" &&
args.Value != null && Convert.ToInt32(args.Value) < 10)
{
args.CellStyle.BackColor = Color.FromArgb(255, 220, 220);
args.CellStyle.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Bold);
}
};
dgvOrders.Columns["ID"].Visible = false;
}
private void LoadOrders()
{
try
{
string query = @"SELECT
p.id AS 'ID',
p.purchase_date AS 'Дата',
COALESCE(c.full_name, '—') AS 'Клиент',
COALESCE(pr.prescription_number, '—') AS 'Рецепт',
GROUP_CONCAT(CONCAT(m.medication_name, ' ×', pm.quantity) SEPARATOR ', ') AS 'Состав',
SUM(m.price * pm.quantity) AS 'Сумма, ₽'
FROM purchases p
LEFT JOIN clients c ON p.client_id = c.id
LEFT JOIN prescriptions pr ON p.prescription_id = pr.id
LEFT JOIN purchase_medications pm ON p.id = pm.purchase_id
LEFT JOIN medications m ON pm.medication_id = m.id
GROUP BY p.id
ORDER BY p.purchase_date DESC";
dgvOrders.DataSource = DB.ExecuteQuery(query);
dgvOrders.Columns["Сумма, ₽"].DefaultCellStyle.Format = "0.00 ₽";
dgvOrders.Columns["Сумма, ₽"].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
}
catch (Exception ex)
{
MessageBox.Show("Ошибка загрузки заказов: " + ex.Message, "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
private void dgvProducts_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{
if (e.RowIndex >= 0)
EditSelectedProduct();
}
private void btnAddProduct_Click(object sender, EventArgs e)
{
var productForm = new ProductForm(-1);
if (productForm.ShowDialog() == DialogResult.OK)
{
LoadProducts();
LoadSuppliers();
MessageBox.Show("овар добавлен!", "Успех",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btnEditProduct_Click(object sender, EventArgs e)
{
EditSelectedProduct();
}
private void EditSelectedProduct()
{
if (dgvProducts.CurrentRow == null)
{
MessageBox.Show("Выберите товар для редактирования!", "Внимание",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
int productId = Convert.ToInt32(dgvProducts.CurrentRow.Cells["ID"].Value);
var productForm = new ProductForm(productId);
if (productForm.ShowDialog() == DialogResult.OK)
{
LoadProducts();
MessageBox.Show("Товар обновлён!", "Успех",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btnDeleteProduct_Click(object sender, EventArgs e)
{
if (dgvProducts.CurrentRow == null)
{
MessageBox.Show("Выберите товар для удаления!", "Внимание",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
int productId = Convert.ToInt32(dgvProducts.CurrentRow.Cells["ID"].Value);
string productName = dgvProducts.CurrentRow.Cells["Название"].Value.ToString();
var checkQuery = "SELECT COUNT(*) FROM purchase_medications WHERE medication_id = @id";
var count = DB.ExecuteScalar(checkQuery, new MySqlParameter[] { new MySqlParameter("@id", productId) });
if (Convert.ToInt32(count) > 0)
{
MessageBox.Show(" Нельзя удалить товар, который есть в истории заказов!", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
var result = MessageBox.Show(
$"Удалить товар \"{productName}\"?\n\nЭто действие нельзя отменить.",
"Подтверждение удаления",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
try
{
DB.ExecuteCommand("DELETE FROM medications WHERE id = @id",
new MySqlParameter[] { new MySqlParameter("@id", productId) });
LoadProducts();
MessageBox.Show("Товар удалён!", "Успех",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
MessageBox.Show("Ошибка: " + ex.Message, "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
private void btnRefresh_Click(object sender, EventArgs e)
{
txtSearch.Clear();
cbFilterStatus.SelectedIndex = 0;
cbFilterSupplier.SelectedIndex = 0;
LoadProducts();
LoadOrders();
MessageBox.Show("Данные обновлены", "Информация",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
private void btnLogout_Click(object sender, EventArgs e)
{
var result = MessageBox.Show("Выйти из системы?", "Подтверждение",
MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (result == DialogResult.Yes)
{
this.Hide();
var loginForm = new LoginForm();
loginForm.Show();
this.FormClosed += (s, args) => loginForm.FormClosed += (s2, a2) => Application.Exit();
}
}
protected override void OnActivated(EventArgs e)
{
base.OnActivated(e);
LoadProducts();
LoadOrders();
}
private void button1_Click(object sender, EventArgs e)
{
if (dgvProducts.CurrentRow != null)
{
int productId = Convert.ToInt32(dgvProducts.CurrentRow.Cells["ID"].Value);
var qrForm = new QRCodeViewerForm(productId);
qrForm.ShowDialog();
}
}
}
}