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

202 lines
7.1 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.Drawing;
using System.IO;
using System.Text;
using System.Windows.Forms;
using QRCoder;
using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using System.Xml;
namespace Neshina1703
{
public static class QRCodeHelper
{
private static readonly string QRCodeFolder = Path.Combine(
Application.StartupPath, "QRCodes");
public static string BaseUrl = "http://localhost:5000/medication/";
static QRCodeHelper()
{
if (!Directory.Exists(QRCodeFolder))
Directory.CreateDirectory(QRCodeFolder);
}
public static string GenerateQRCodeForMedication(int medicationId, string medicationName)
{
try
{
var medicationInfo = GetMedicationInfo(medicationId);
string qrData = CreateQRCodeData(medicationInfo);
using (var qrGenerator = new QRCodeGenerator())
using (var qrCodeData = qrGenerator.CreateQrCode(qrData, QRCodeGenerator.ECCLevel.Q))
using (var qrCode = new PngByteQRCode(qrCodeData))
{
string fileName = $"medication_{medicationId}.png";
string filePath = Path.Combine(QRCodeFolder, fileName);
File.WriteAllBytes(filePath, qrCode.GetGraphic(20));
SaveQRCodePath(medicationId, filePath);
return filePath;
}
}
catch (Exception ex)
{
MessageBox.Show($"Ошибка генерации QR-кода: {ex.Message}", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return null;
}
}
private static string CreateQRCodeData(MedicationInfo info)
{
var qrData = new
{
id = info.Id,
name = info.Name,
price = info.Price,
stock = info.StockQuantity,
supplier = info.Supplier,
status = info.DispensingStatus,
instructions = info.Instructions,
analogs = info.Analogs,
generated = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
};
return JsonConvert.SerializeObject(qrData, Newtonsoft.Json.Formatting.Indented);
}
private static MedicationInfo GetMedicationInfo(int medicationId)
{
var query = @"SELECT
m.id,
m.medication_name,
m.price,
m.stock_quantity,
m.instructions,
m.has_analog,
s.supplier_name,
ds.status_name,
(SELECT GROUP_CONCAT(m2.medication_name SEPARATOR ', ')
FROM medications m2
WHERE m2.id != m.id
AND EXISTS (
SELECT 1 FROM medications m3
WHERE m3.medication_name LIKE CONCAT('%', SUBSTRING_INDEX(m.medication_name, ' ', 1), '%')
AND m3.id = m2.id
)
) as analogs
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
WHERE m.id = @id";
var parameters = new MySqlParameter[]
{
new MySqlParameter("@id", medicationId)
};
var table = DB.ExecuteQuery(query, parameters);
if (table.Rows.Count == 0)
throw new Exception("Товар не найден");
var row = table.Rows[0];
return new MedicationInfo
{
Id = Convert.ToInt32(row["id"]),
Name = row["medication_name"].ToString(),
Price = Convert.ToDecimal(row["price"]),
StockQuantity = Convert.ToInt32(row["stock_quantity"]),
Supplier = row["supplier_name"]?.ToString(),
DispensingStatus = row["status_name"]?.ToString(),
Instructions = row["instructions"]?.ToString() ?? "Инструкция не указана",
Analogs = row["analogs"] != DBNull.Value ? row["analogs"].ToString() : "Аналоги не найдены"
};
}
private static void SaveQRCodePath(int medicationId, string filePath)
{
var query = @"UPDATE medications SET qr_code_path = @path WHERE id = @id";
var parameters = new MySqlParameter[]
{
new MySqlParameter("@path", filePath),
new MySqlParameter("@id", medicationId)
};
DB.ExecuteCommand(query, parameters);
}
public static void GenerateAllQRCodes()
{
var query = "SELECT id, medication_name FROM medications";
var medications = DB.ExecuteQuery(query);
int count = 0;
foreach (System.Data.DataRow row in medications.Rows)
{
int id = Convert.ToInt32(row["id"]);
string name = row["medication_name"].ToString();
GenerateQRCodeForMedication(id, name);
count++;
}
MessageBox.Show($"Сгенерировано QR-кодов: {count}", "Готово",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
public static void ShowQRCodeInfo(string qrCodePath)
{
if (!File.Exists(qrCodePath))
{
MessageBox.Show("QR-код не найден", "Ошибка",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
string fileName = Path.GetFileName(qrCodePath);
if (fileName.StartsWith("medication_") && fileName.EndsWith(".png"))
{
string idStr = fileName.Replace("medication_", "").Replace(".png", "");
if (int.TryParse(idStr, out int medicationId))
{
var info = GetMedicationInfo(medicationId);
DisplayMedicationInfo(info);
}
}
}
private static void DisplayMedicationInfo(MedicationInfo info)
{
string message = $@"
💊 {info.Name}
💰 Цена: {info.Price} ₽
📦 На складе: {info.StockQuantity} шт.
🏢 Поставщик: {info.Supplier}
📋 Отпуск: {info.DispensingStatus}
📖 Инструкция:
{info.Instructions}
🔄 Аналоги:
{info.Analogs}
";
MessageBox.Show(message, "Информация о препарате",
MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
public class MedicationInfo
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
public int StockQuantity { get; set; }
public string Supplier { get; set; }
public string DispensingStatus { get; set; }
public string Instructions { get; set; }
public string Analogs { get; set; }
}
}