277 lines
11 KiB
C#
277 lines
11 KiB
C#
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();
|
||
}
|
||
|
||
}
|
||
}
|
||
} |