Untitled
using System; using System.Collections.Generic; using System.Data.SQLite; namespace PizzeriaAppWithDB { // Базовый класс для меню abstract class MenuItem { private int _id; private string _name; private double _price; public int Id { get => _id; set => _id = value; } public string Name { get => _name; set => _name = value; } public double Price { get => _price; set => _price = value; } protected MenuItem(int id, string name, double price) { _id = id; _name = name; _price = price; } public abstract override string ToString(); } // Класс для пиццы class Pizza : MenuItem { public Pizza(int id, string name, double price) : base(id, name, price) { } public override string ToString() { return $"{Id}. {Name} - {Price} р (Пицца)"; } } // Класс для напитков class Drink : MenuItem { public int Volume { get; set; } // в миллилитрах public Drink(int id, string name, double price, int volume) : base(id, name, price) { Volume = volume; } public override string ToString() { return $"{Id}. {Name} - {Price} р ({Volume} мл, Напиток)"; } } class Database { private const string ConnectionString = "Data Source=pizzeria.db;Version=3;"; public void Initialize() { using (var connection = new SQLiteConnection(ConnectionString)) { connection.Open(); var createPizzaTable = "CREATE TABLE IF NOT EXISTS Pizzas (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Price REAL)"; var createDrinkTable = "CREATE TABLE IF NOT EXISTS Drinks (Id INTEGER PRIMARY KEY AUTOINCREMENT, Name TEXT, Price REAL, Volume INTEGER)"; var createOrdersTable = @"CREATE TABLE IF NOT EXISTS Orders (Id INTEGER PRIMARY KEY AUTOINCREMENT, MenuItemId INTEGER, ItemType TEXT, OrderDate TEXT)"; using (var command = new SQLiteCommand(createPizzaTable, connection)) { command.ExecuteNonQuery(); } using (var command = new SQLiteCommand(createDrinkTable, connection)) { command.ExecuteNonQuery(); } using (var command = new SQLiteCommand(createOrdersTable, connection)) { command.ExecuteNonQuery(); } // Добавим пиццы и напитки в базу данных, если они отсутствуют var insertPizzaQuery = "INSERT INTO Pizzas (Name, Price) SELECT @Name, @Price WHERE NOT EXISTS (SELECT 1 FROM Pizzas WHERE Name = @Name)"; var pizzas = new List<Pizza> { new Pizza(0, "Маргарита", 500), new Pizza(0, "Пепперони", 600), new Pizza(0, "Гавайская", 550) }; foreach (var pizza in pizzas) { using (var command = new SQLiteCommand(insertPizzaQuery, connection)) { command.Parameters.AddWithValue("@Name", pizza.Name); command.Parameters.AddWithValue("@Price", pizza.Price); command.ExecuteNonQuery(); } } var insertDrinkQuery = "INSERT INTO Drinks (Name, Price, Volume) SELECT @Name, @Price, @Volume WHERE NOT EXISTS (SELECT 1 FROM Drinks WHERE Name = @Name)"; var drinks = new List<Drink> { new Drink(0, "Кола", 150, 500), new Drink(0, "Сок", 120, 300), new Drink(0, "Вода", 50, 500) }; foreach (var drink in drinks) { using (var command = new SQLiteCommand(insertDrinkQuery, connection)) { command.Parameters.AddWithValue("@Name", drink.Name); command.Parameters.AddWithValue("@Price", drink.Price); command.Parameters.AddWithValue("@Volume", drink.Volume); command.ExecuteNonQuery(); } } } } public List<MenuItem> GetMenuItems() { var menuItems = new List<MenuItem>(); using (var connection = new SQLiteConnection(ConnectionString)) { connection.Open(); // Получаем пиццы var pizzaQuery = "SELECT * FROM Pizzas"; using (var command = new SQLiteCommand(pizzaQuery, connection)) using (var reader = command.ExecuteReader()) { while (reader.Read()) { menuItems.Add(new Pizza(reader.GetInt32(0), reader.GetString(1), reader.GetDouble(2))); } } // Получаем напитки var drinkQuery = "SELECT * FROM Drinks"; using (var command = new SQLiteCommand(drinkQuery, connection)) using (var reader = command.ExecuteReader()) { while (reader.Read()) { menuItems.Add(new Drink(reader.GetInt32(0), reader.GetString(1), reader.GetDouble(2), reader.GetInt32(3))); } } } return menuItems; } public void AddOrder(int itemId, string itemType) { using (var connection = new SQLiteConnection(ConnectionString)) { connection.Open(); var query = "INSERT INTO Orders (MenuItemId, ItemType, OrderDate) VALUES (@ItemId, @ItemType, @OrderDate)"; using (var command = new SQLiteCommand(query, connection)) { command.Parameters.AddWithValue("@ItemId", itemId); command.Parameters.AddWithValue("@ItemType", itemType); command.Parameters.AddWithValue("@OrderDate", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); command.ExecuteNonQuery(); } } } public List<(string ItemName, string ItemType, string OrderDate)> GetOrderHistory() { var orders = new List<(string ItemName, string ItemType, string OrderDate)>(); using (var connection = new SQLiteConnection(ConnectionString)) { connection.Open(); var query = @"SELECT CASE WHEN ItemType = 'Pizza' THEN (SELECT Name FROM Pizzas WHERE Id = Orders.MenuItemId) WHEN ItemType = 'Drink' THEN (SELECT Name FROM Drinks WHERE Id = Orders.MenuItemId) END AS ItemName, ItemType, OrderDate FROM Orders"; using (var command = new SQLiteCommand(query, connection)) using (var reader = command.ExecuteReader()) { while (reader.Read()) { orders.Add((reader.GetString(0), reader.GetString(1), reader.GetString(2))); } } } return orders; } } class Program { static void MakeOrder(Database db) { var menuItems = db.GetMenuItems(); var order = new List<MenuItem>(); while (true) { Console.WriteLine("\nМеню:"); for (int i = 0; i < menuItems.Count; i++) { Console.WriteLine($"{i + 1}. {menuItems[i]}"); } Console.WriteLine("0. Завершить заказ"); Console.Write("\nВыберите товар (номер): "); if (int.TryParse(Console.ReadLine(), out int choice)) { if (choice == 0) { break; } if (choice > 0 && choice <= menuItems.Count) { var selectedItem = menuItems[choice - 1]; order.Add(selectedItem); db.AddOrder(selectedItem.Id, selectedItem is Pizza ? "Pizza" : "Drink"); Console.WriteLine($"{selectedItem.Name} добавлена в заказ."); } else { Console.WriteLine("Некорректный выбор."); } } else { Console.WriteLine("Введите номер товара."); } } Console.WriteLine("\nВаш заказ:"); double total = 0; foreach (var item in order) { Console.WriteLine(item); total += item.Price; } Console.WriteLine($"Итого: {total} р"); Console.WriteLine("Спасибо за заказ! Ожидайте доставку."); } static void ShowOrderHistory(Database db) { var history = db.GetOrderHistory(); if (history.Count == 0) { Console.WriteLine("История заказов пуста."); return; } Console.WriteLine("\nИстория заказов:"); foreach (var (itemName, itemType, orderDate) in history) { Console.WriteLine($"{orderDate}: {itemName} ({itemType})"); } } static void Main(string[] args) { var db = new Database(); db.Initialize(); Console.WriteLine("Добро пожаловать в пиццерию!"); while (true) { Console.WriteLine("\nВыберите действие:"); Console.WriteLine("1. Посмотреть меню и сделать заказ"); Console.WriteLine("2. Посмотреть историю заказов"); Console.WriteLine("0. Выход"); Console.Write("\nВаш выбор: "); if (int.TryParse(Console.ReadLine(), out int choice)) { switch (choice) { case 1: MakeOrder(db); break; case 2: ShowOrderHistory(db); break; case 0: Console.WriteLine("До свидания!"); return; default: Console.WriteLine("Неправильный выбор."); break; } } else { Console.WriteLine("Введите номер действия."); } } } } }
Leave a Comment