Torgach

FixService2.0

May 12th, 2021
738
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Service
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             ServiceMenu menu = new ServiceMenu();
  14.             menu.Run();
  15.         }
  16.     }
  17.  
  18.     class ServiceMenu
  19.     {
  20.         private AutoService _autoService;
  21.         private Shop _shop;
  22.  
  23.         public ServiceMenu()
  24.         {
  25.             _autoService = new AutoService();
  26.             _shop = new Shop();
  27.         }
  28.  
  29.         public void Run()
  30.         {
  31.             while(_autoService.IsServiceWork())
  32.             {
  33.                 Show();
  34.                 if(ChooseItem())
  35.                 {
  36.                     Check();
  37.                 }
  38.                 else
  39.                 {
  40.                     return;
  41.                 }
  42.  
  43.                 Console.ReadKey();
  44.                 Console.Clear();
  45.             }
  46.         }
  47.         public void Show()
  48.         {
  49.             _autoService.ShowBalance();
  50.             Console.WriteLine();
  51.             _autoService.ShowWarehouse();
  52.             Console.WriteLine();
  53.             _autoService.ShowBreakages();
  54.  
  55.             Console.WriteLine("\n[1] - приступить к починке\n" +
  56.                 "[2] - Заказать деталь в магазине\n" +
  57.                 "[3] - выход");
  58.             Console.Write("Ввод: ");
  59.         }
  60.  
  61.         public bool ChooseItem()
  62.         {
  63.             switch (Console.ReadLine())
  64.             {
  65.                 case "1":
  66.                     _autoService.ChooseBrokenDetail();
  67.                     break;
  68.                 case "2":
  69.                     _autoService.SignContract(_shop);
  70.                     break;
  71.                 case "3":
  72.                     return false;
  73.                 default:
  74.                     Console.WriteLine("Ошибка комманды!");
  75.                     break;
  76.             }
  77.             return true;
  78.         }
  79.  
  80.         public void Check()
  81.         {
  82.             if (_autoService.IsCarRepaired())
  83.             {
  84.                 _autoService.CreateNewClient();
  85.             }
  86.             _shop.CheckRefreshCounter();
  87.         }
  88.     }
  89.  
  90.     class AutoService
  91.     {
  92.         private DetailWarehouse _detailsWarehouse;
  93.         private Car _clientCar;
  94.         private int _fine;
  95.  
  96.         public int WorkCost { get; private set; }
  97.         public int Balance { get; private set; }
  98.  
  99.         public AutoService()
  100.         {
  101.             _detailsWarehouse = new DetailWarehouse();
  102.             _clientCar = new Car();
  103.             Balance = 2500;
  104.             WorkCost = 5000;
  105.             _fine = 2500;
  106.         }
  107.  
  108.         public bool IsServiceWork()
  109.         {
  110.             if (IsWarehouseEmpty())
  111.             {
  112.                 Console.WriteLine("Запасов больше нет! Закрываем гараж.");
  113.                 return false;
  114.             }
  115.             else if(CheckNegativeBalance())
  116.             {
  117.                 Console.WriteLine("Отрицательный баланс! Закрываем гараж.");
  118.                 return false;
  119.             }
  120.             return true;
  121.         }
  122.  
  123.         public void ShowBalance()
  124.         {
  125.             Console.WriteLine($"Баланс: {Balance}");
  126.         }
  127.  
  128.         public void ShowBreakages()
  129.         {
  130.             _clientCar.ShowBrokenDetails();
  131.         }
  132.  
  133.         public void ChooseBrokenDetail()
  134.         {
  135.             Console.WriteLine("Выберите деталь, которую вы хотите починить: \n" +
  136.                 "[1] - Двигатель\n" +
  137.                 "[2] - Подвеска\n" +
  138.                 "[3] - Проводка\n" +
  139.                 "[4] - Кузов");
  140.             Console.Write("Ввод: ");
  141.  
  142.             if (int.TryParse(Console.ReadLine(), out int productNumber) == false
  143.                 && productNumber > _detailsWarehouse.GetMaxPartsNumber())
  144.             {
  145.                 Console.WriteLine("Ошибка! Такой детали нет.");
  146.                 return;
  147.             }
  148.  
  149.             --productNumber;
  150.             DetailType detailType = (DetailType)productNumber;
  151.  
  152.             RepairDetail(detailType);
  153.         }
  154.        
  155.         public void SignContract(Shop shop)
  156.         {
  157.             if (Balance == 0)
  158.             {
  159.                 Console.WriteLine("Ошибка! Нет предоплаты");
  160.                 return;
  161.             }
  162.  
  163.             shop.Show();
  164.  
  165.             if (shop.IsDetailChosen(out DetailType detailType) == false)
  166.             {
  167.                 return;
  168.             }
  169.  
  170.             Balance -= shop.MakePrepayment(detailType);
  171.             _detailsWarehouse.AddDetail(shop.BuyProduct(detailType));
  172.         }
  173.  
  174.         public bool CheckNegativeBalance()
  175.         {
  176.             return Balance <= 0;
  177.         }
  178.  
  179.         public bool IsWarehouseEmpty()
  180.         {
  181.             return _detailsWarehouse.IsSpaceDetailsEmpty();
  182.         }
  183.  
  184.         public bool IsCarRepaired()
  185.         {
  186.             return _clientCar.IsDetailsBroken() == false;
  187.         }
  188.         public void CreateNewClient()
  189.         {
  190.             _clientCar = new Car();
  191.         }
  192.  
  193.         public void ShowWarehouse()
  194.         {
  195.             _detailsWarehouse.ShowSpaceDetails();
  196.         }
  197.  
  198.         private void RepairDetail(DetailType detailType)
  199.         {
  200.             Detail detail = _clientCar.GetBrokenDetailByType(detailType);
  201.  
  202.             if (detail.IsBroken == false)
  203.             {
  204.                 Console.WriteLine("Деталь в рабочем состоянии!");
  205.                 _detailsWarehouse.TakeDetail(detail.DetailType);
  206.                 GetFine();
  207.                 return;
  208.             }
  209.  
  210.             _clientCar.ReplaceDetail(_detailsWarehouse.TakeDetail(detail.DetailType));
  211.             GetProfit(_detailsWarehouse.GetPrice(detail.DetailType));
  212.         }
  213.  
  214.         private void GetFine()
  215.         {
  216.             Balance -= _fine;
  217.         }
  218.  
  219.         private void GetProfit(int detailPrice)
  220.         {
  221.             Balance += detailPrice + WorkCost;
  222.         }
  223.     }
  224.  
  225.     class Car
  226.     {
  227.         private static Random _random = new Random();
  228.  
  229.         private List<Detail> _details;
  230.  
  231.         public Car()
  232.         {
  233.             _details = new List<Detail>()
  234.             {
  235.                 new Detail("Двигатель", DetailType.Engine, TryToBreak()),
  236.                 new Detail("Подвеска", DetailType.Suspension, TryToBreak()),
  237.                 new Detail("Проводка", DetailType.Wiring, TryToBreak()),
  238.                 new Detail("Кузов", DetailType.Body, TryToBreak())
  239.             };
  240.  
  241.             CheckCreatedDetails();
  242.         }
  243.  
  244.         public void ReplaceDetail(Detail newDetail)
  245.         {
  246.             for (int i = 0; i < _details.Count; i++)
  247.             {
  248.                 if(_details[i].DetailType == newDetail.DetailType)
  249.                 {
  250.                     _details[i] = newDetail;
  251.                 }
  252.             }
  253.         }
  254.  
  255.         public Detail GetBrokenDetailByType(DetailType detailType)
  256.         {
  257.             foreach (var brokenDetail in _details)
  258.             {
  259.                 if (brokenDetail.DetailType == detailType)
  260.                 {
  261.                     return brokenDetail;
  262.                 }
  263.             }
  264.  
  265.             throw new Exception("Ошибка! Деталь, которую вы хотите взять не храниться на складе!");
  266.         }
  267.  
  268.         public bool IsDetailsBroken()
  269.         {
  270.             foreach (var detail in _details)
  271.             {
  272.                 if (detail.IsBroken)
  273.                     return true;
  274.             }
  275.             return false;
  276.         }
  277.  
  278.         public void ShowBrokenDetails()
  279.         {
  280.             foreach (var brokenDetail in _details)
  281.             {
  282.                 if (brokenDetail.IsBroken)
  283.                 {
  284.                     Console.WriteLine($"{brokenDetail.Name} в критическом состоянии!");
  285.                 }
  286.             }
  287.         }
  288.  
  289.         private bool TryToBreak()
  290.         {
  291.             return Convert.ToBoolean(_random.Next(0, 2));
  292.         }
  293.  
  294.         private void CheckCreatedDetails()
  295.         {
  296.             List<Detail> details = new List<Detail>();
  297.  
  298.             foreach (var detail in _details)
  299.             {
  300.                 if(detail.IsBroken == false)
  301.                 {
  302.                     details.Add(detail);
  303.                 }
  304.                 else
  305.                 {
  306.                     return;
  307.                 }
  308.             }
  309.             details[_random.Next(0, details.Count)].BreakDetail();
  310.         }
  311.     }
  312.  
  313.     class Detail
  314.     {
  315.         public string Name { get; protected set; }
  316.         public DetailType DetailType { get; protected set; }
  317.         public bool IsBroken { get; protected set; }
  318.  
  319.         public Detail(string name, DetailType detailType, bool isBroken)
  320.         {
  321.             Name = name;
  322.             DetailType = detailType;
  323.             IsBroken = isBroken;
  324.         }
  325.  
  326.         public void BreakDetail()
  327.         {
  328.             IsBroken = true;
  329.         }
  330.     }
  331.  
  332.     enum DetailType
  333.     {
  334.         Engine,
  335.         Suspension,
  336.         Wiring,
  337.         Body
  338.     }
  339.  
  340.     class SpareDetail : Detail
  341.     {
  342.         public int Price { get; private set; }
  343.  
  344.         public SpareDetail(string name, DetailType detailType, bool isBroken, int price) : base(name, detailType, isBroken)
  345.         {
  346.             Name = name;
  347.             IsBroken = false;
  348.             Price = price;
  349.         }
  350.     }
  351.  
  352.     abstract class Warehouse
  353.     {
  354.         protected Dictionary<SpareDetail, int> _spareDetails;
  355.  
  356.         public void ShowSpaceDetails()
  357.         {
  358.             foreach (var spareDetail in _spareDetails)
  359.             {
  360.                 Console.WriteLine($"{spareDetail.Key.Name } - {spareDetail.Value}");
  361.             }
  362.         }
  363.  
  364.         public Detail TakeDetail(DetailType detailType)
  365.         {
  366.             foreach (var requiredDetail in _spareDetails)
  367.             {
  368.                 if (requiredDetail.Key.DetailType == detailType)
  369.                 {
  370.                     _spareDetails[requiredDetail.Key] -= 1;
  371.                     return requiredDetail.Key;
  372.                 }
  373.             }
  374.  
  375.             throw new Exception("Ошибка! Деталь, которую вы хотите взять не храниться на складе!");
  376.         }
  377.  
  378.         public int GetPrice(DetailType detailType)
  379.         {
  380.             foreach (var requiredDetail in _spareDetails)
  381.             {
  382.                 if (requiredDetail.Key.DetailType == detailType)
  383.                 {
  384.                     return requiredDetail.Key.Price;
  385.                 }
  386.             }
  387.             throw new Exception("Ошибка! Деталь, которую вы хотите взять не храниться на складе! Цену получить нельзя!");
  388.         }
  389.  
  390.         public bool IsSpaceDetailsEmpty()
  391.         {
  392.             foreach (var spareDetail in _spareDetails)
  393.             {
  394.                 if (spareDetail.Value != 0)
  395.                 {
  396.                     return false;
  397.                 }
  398.             }
  399.             return true;
  400.         }
  401.     }
  402.  
  403.     class DetailWarehouse : Warehouse
  404.     {
  405.         public DetailWarehouse()
  406.         {
  407.             Detail Engine = new SpareDetail("Двигатель", DetailType.Engine, true, 20000);
  408.             SpareDetail spaceEngine = Engine as SpareDetail;
  409.  
  410.             Detail Suspension = new SpareDetail("Подвеска", DetailType.Suspension, true, 15000);
  411.             SpareDetail spaceSuspencion = Suspension as SpareDetail;
  412.  
  413.             Detail Wiring = new SpareDetail("Проводка", DetailType.Wiring, true, 10000);
  414.             SpareDetail spaceWiring = Wiring as SpareDetail;
  415.  
  416.             Detail Body = new SpareDetail("Кузов", DetailType.Body, true, 5000);
  417.             SpareDetail spaceBody = Body as SpareDetail;
  418.  
  419.             _spareDetails = new Dictionary<SpareDetail, int>
  420.             {
  421.                 { spaceEngine, 5 },
  422.                 { spaceSuspencion, 5 },
  423.                 { spaceWiring, 5 },
  424.                 { spaceBody, 5 }
  425.             };
  426.         }
  427.  
  428.         public void AddDetail(Detail detail)
  429.         {
  430.             foreach (var spareDetail in _spareDetails.ToArray())
  431.             {
  432.                 if(spareDetail.Key.DetailType == detail.DetailType)
  433.                 {
  434.                     _spareDetails[spareDetail.Key] += 1;
  435.                     return;
  436.                 }
  437.             }
  438.         }
  439.  
  440.         public int GetMaxPartsNumber()
  441.         {
  442.             return _spareDetails.Keys.Count;
  443.         }
  444.  
  445.     }
  446.  
  447.     class Shop : Warehouse
  448.     {
  449.         private int _maxProducts;
  450.  
  451.         public int RefreshCounter { get; private set; }
  452.  
  453.         public Shop()
  454.         {
  455.             _maxProducts = 7;
  456.             RefreshCounter = 5;
  457.  
  458.             Detail Engine = new SpareDetail("Двигатель", DetailType.Engine, true, 10000);
  459.             SpareDetail spaceEngine = Engine as SpareDetail;
  460.  
  461.             Detail Suspension = new SpareDetail("Подвеска", DetailType.Suspension, true, 7000);
  462.             SpareDetail spaceSuspencion = Suspension as SpareDetail;
  463.  
  464.             Detail Wiring = new SpareDetail("Проводка", DetailType.Wiring, true, 5000);
  465.             SpareDetail spaceWiring = Wiring as SpareDetail;
  466.  
  467.             Detail Body = new SpareDetail("Кузов", DetailType.Body, true, 2500);
  468.             SpareDetail spaceBody = Body as SpareDetail;
  469.  
  470.             _spareDetails = new Dictionary<SpareDetail, int>
  471.             {
  472.                 { spaceEngine, 7 },
  473.                 { spaceSuspencion, 7 },
  474.                 { spaceWiring, 7 },
  475.                 { spaceBody, 7 }
  476.             };
  477.         }
  478.  
  479.         public void Show()
  480.         {
  481.             Console.WriteLine("\nКакой товар вы хотите купить?\n" +
  482.                     "[1] - Двигатель\n" +
  483.                     "[2] - Подвеска\n" +
  484.                     "[3] - Проводка\n" +
  485.                     "[4] - Кузов\n" +
  486.                     "[exit] - Выйти из каталога");
  487.             Console.Write("Ввод: ");
  488.         }
  489.  
  490.         public bool IsDetailChosen(out DetailType detailType)
  491.         {
  492.             detailType = 0;
  493.  
  494.             string userInput = Console.ReadLine();
  495.  
  496.             if(userInput == "exit")
  497.             {
  498.                 return false;
  499.             }
  500.  
  501.             if (int.TryParse(userInput, out int numberProduct) && numberProduct <= _maxProducts)
  502.             {
  503.                 --numberProduct;
  504.                 detailType = (DetailType)numberProduct;
  505.                 return true;
  506.             }
  507.             return false;
  508.         }
  509.  
  510.         public int MakePrepayment(DetailType detailType)
  511.         {
  512.             return GetPrice(detailType);
  513.         }
  514.  
  515.         public Detail BuyProduct(DetailType detailType)
  516.         {
  517.             return TakeDetail(detailType);
  518.         }
  519.  
  520.         public void CheckRefreshCounter()
  521.         {
  522.             if (RefreshCounter == 0)
  523.             {
  524.                 UpdateProducts();
  525.                 RefreshCounter = 6;
  526.             }
  527.             RefreshCounter -= 1;
  528.         }
  529.  
  530.         private void UpdateProducts()
  531.         {
  532.             Dictionary<SpareDetail, int> tempList = new Dictionary<SpareDetail, int>(_spareDetails);
  533.  
  534.             foreach (var product in tempList)
  535.             {
  536.                 if (product.Value != _maxProducts)
  537.                 {
  538.                     _spareDetails[product.Key] = _maxProducts;
  539.                 }
  540.             }
  541.         }
  542.     }
  543. }
RAW Paste Data