Untitled

 avatar
unknown
plain_text
a month ago
12 kB
5
Indexable
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