123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453 |
- using Newtonsoft.Json;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading.Tasks;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Data;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Imaging;
- using System.Windows.Navigation;
- using System.Windows.Shapes;
- using System.Windows.Threading;
- namespace FillingColumn
- {
- /// <summary>
- /// Логика взаимодействия для RefuelingPage.xaml
- /// </summary>
- public partial class RefuelingPage : Page
- {
- public RefuelingPage()
- {
- InitializeComponent();
- var timer = new DispatcherTimer();
- timer.Interval = new TimeSpan(0, 0, 5);
- timer.IsEnabled = true;
- timer.Tick += Timer_Tick;
- timer.Start();
- AddTypeOFRefueling();
- CmbTypeOfFuel.ItemsSource = Helper.CurrentGasStation.FuelInCurrentGasStation;
- Title = $"Работа с колонкой на АЗС {Helper.CurrentGasStation.GasStationID}";
- }
- //Событие таймера
- private async void Timer_Tick(object sender, EventArgs e)
- {
- try
- {
- HttpClient client = new HttpClient();
- var response = await client.GetAsync("http://127.0.0.1:7070/getDataFromCamera/");
- var Body = await response.Content.ReadAsStringAsync();
- DataOfCamera dataFromCamera = JsonConvert.DeserializeObject<DataOfCamera>(Body);
- Helper.DataFromCamera = dataFromCamera;
- TxtDataOfCamera.Text = "Гос. номер распознан: " + dataFromCamera.CarNumber;
- FindCar(Body);
- }
- catch (Exception)
- {
- TxtDataOfCamera.Text = "Нет ответа от камеры";
- Helper.FindCar = null;
- }
- }
-
- public async void FindCar(string JsonDataOfCamera)
- {
- string IDGasStation = Helper.CurrentGasStation.GasStationID.ToString();
- if (IDGasStation.Length == 1)
- {
- IDGasStation = IDGasStation.Insert(0, "0");
- }
- string port = "102" + IDGasStation;
- IPEndPoint IpPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), Convert.ToInt32(port));
- Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- socket.Connect(IpPoint);
- //Отправка данных с камеры на сервер АЗС
- string request = "POST data of camera=" + JsonDataOfCamera;
- byte[] data = Encoding.UTF8.GetBytes(request);
- socket.Send(data);
- //Получение ответа от сервера АЗС
- data = new byte[256]; // буфер для ответа
- StringBuilder builder = new StringBuilder();
- int bytes = 0; // количество полученных байт
- do
- {
- bytes = socket.Receive(data, data.Length, 0);
- builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
- }
- while (socket.Available > 0);
- //Десериализация данных о машине
- Helper.FindCar = JsonConvert.DeserializeObject<RootDataOfCar>(builder.ToString());
- AddTypeOFRefueling();
- // закрываем сокет
- socket.Shutdown(SocketShutdown.Both);
- socket.Close();
- }
- //Задание ограничений по типам запрвки
- public void AddTypeOFRefueling()
- {
- List<string> TypeOfRefueling = new List<string>();
- TypeOfRefueling.Add("Фиксированный объем");
- TypeOfRefueling.Add("Фиксированная цена");
- TypeOfRefueling.Add("До полного бака с ограничением по объему");
- List<string> TypeOfPayment = new List<string>();
- TypeOfPayment.Add("Банковской картой");
- if (Helper.FindCar != null)
- {
- if (Helper.FindCar.CardOfCars != null)
- {
- if (Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 3) != null)
- {
- TypeOfPayment.Add("Накопительной картой");
- }
- if (Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 1) != null)
- {
- TypeOfPayment.Add("Кредитной картой");
- }
- }
-
- }
- CmbTypeOfPayment.ItemsSource = TypeOfPayment;
- CmbTypeOfRefueling.ItemsSource = TypeOfRefueling;
- }
- private void BtnEnterDataOfCard_Click(object sender, RoutedEventArgs e)
- {
- AddDataOfCardWindow addDataOfCardWindow = new AddDataOfCardWindow();
- addDataOfCardWindow.ShowDialog();
- }
- private void BtnPayment_Click(object sender, RoutedEventArgs e)
- {
- if (TbAmount.Text == string.Empty && CmbTypeOfRefueling.SelectedIndex == 0)
- {
- MessageBox.Show("Не указан объём топлива", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- if (TbCost.Text == string.Empty && CmbTypeOfRefueling.SelectedIndex == 1)
- {
- MessageBox.Show("Не указана стоимость для заправки", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- if (TxtErroreMessage.Visibility == Visibility.Visible)
- {
- MessageBox.Show("Не корректные данные", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- decimal cost = string.IsNullOrEmpty(TbCost.Text) ? Convert.ToDecimal(TxtCost.Text.Split(' ')[0]) : Convert.ToDecimal(TbCost.Text);
- int amount = string.IsNullOrEmpty(TbAmount.Text) ? Convert.ToInt32(TxtAmount.Text.Split(' ')[0]) : Convert.ToInt32(TbAmount.Text);
- int FuelID = (CmbTypeOfFuel.SelectedItem as FuelInCurrentGasStation).IDFuelType;
- switch (CmbTypeOfPayment.SelectedValue.ToString())
- {
- case "Банковской картой":
- PaymentBankCard(cost, amount, FuelID); break;
- case "Накопительной картой":
- PaymentSavingCard(cost, amount, FuelID); break;
- case "Кредитной картой":
- PaymentCreditCard(cost,amount, FuelID); break;
- }
- }
- //Оплат банковской картой
- public async void PaymentBankCard(decimal cost, int amount, int FuelID)
- {
- Helper.EnterPIN = string.Empty;
- if (Helper.EnterBankCard == null && Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 2) == null)
- {
- MessageBox.Show("Введите информацию о карте", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- var CurrentFuel = Helper.CurrentGasStation.FuelInCurrentGasStation.FirstOrDefault(x => x.IDFuelType == FuelID);
- if (CurrentFuel.AmountOfFuel < amount)
- {
- MessageBox.Show($"Не достаточно топлива в хранилище! Доступно {CurrentFuel.AmountOfFuel} л.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- var BankCard = Helper.EnterBankCard is null ? Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 2) : Helper.EnterBankCard;
- EnterPINWindow enterPINWindow = new EnterPINWindow();
- enterPINWindow.ShowDialog();
- if (Helper.EnterPIN == string.Empty)
- {
- MessageBox.Show("Введите ПИН", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- DataOfPayment dataOfPayment = new DataOfPayment()
- {
- PriceRefueling = cost,
- NumberCard = BankCard.NumberCard,
- CardExpDate = BankCard.CardExpDate,
- Balance = BankCard.Balance,
- CardHolder = BankCard.CardHolder,
- KeySession = Helper.KeySession,
- PIN = Helper.EnterPIN
- };
- HttpClient BankClient = new HttpClient();
- string Json = JsonConvert.SerializeObject(dataOfPayment);
- StringContent content = new StringContent(Json, Encoding.UTF8);
- var response = await BankClient.PostAsync($"http://127.0.0.1:8081/pay", content);
- var ResponseMessage = await response.Content.ReadAsStringAsync();
- MessageBox.Show($"{ResponseMessage}", "Информация", MessageBoxButton.OK, MessageBoxImage.Information);
- if (ResponseMessage.Contains("Отклонено")) return;
- RootDataOfRefuling rootDataOfRefuling = new RootDataOfRefuling
- {
- Car = Helper.FindCar,
- KeySession = Helper.KeySession,
- DataOfCamera = Helper.DataFromCamera,
- VolumeFuel = amount,
- CurrentFuelID = CurrentFuel.IDFuelType,
- GasStationID = Helper.CurrentGasStation.GasStationID
- };
- RootDataOfPayment rootDataOfPayment = new RootDataOfPayment()
- {
- RootDataOfCard = BankCard,
- PriceRefueling = cost,
- Status = true,
- TransactionCode = DateTime.Now.ToString("ddMMyyyy-hhmmss"),
- RootDataOfRefuling = rootDataOfRefuling
- };
- PostDataOfPayment(JsonConvert.SerializeObject(rootDataOfPayment));
- }
- //Оплата накопительной картой
- public void PaymentSavingCard(decimal cost, int amount, int FuelID)
- {
- var CurrentFuel = Helper.CurrentGasStation.FuelInCurrentGasStation.FirstOrDefault(x => x.IDFuelType == FuelID);
- if( CurrentFuel.AmountOfFuel < amount)
- {
- MessageBox.Show($"Не достаточно топлива в хранилище! Доступно {CurrentFuel.AmountOfFuel} л.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- var SavingCard = Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 3);
- if (SavingCard.Balance < cost)
- {
- double Amount = Convert.ToDouble(SavingCard.Balance) / CurrentFuel.Price;
- double AvailableAmountFuel = Math.Truncate(Amount) * CurrentFuel.Price;
- bool CreditCardIsEnable = Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 3) is null ? false : true;
- decimal MissingAmount = cost - SavingCard.Balance;
- if (Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 3).Balance < MissingAmount)
- {
- CreditCardIsEnable = false;
- }
- NoMoneyWindow noMoneyWindow = new NoMoneyWindow(MissingAmount, CreditCardIsEnable, Convert.ToInt32(Math.Truncate(Amount)));
- noMoneyWindow.ShowDialog();
- if (Helper.TypeOfNoMoney == 0)
- {
- return;
- }
- switch (Helper.TypeOfNoMoney)
- {
- //Оплата кредитной картой
- case 1:
- PaymentBankCard(cost, amount, FuelID);
- break;
- //Оплата на все накопленные бонусы
- case 2: amount = Convert.ToInt32(Math.Truncate(Amount));
- cost = (decimal)AvailableAmountFuel;
- break;
- //Оплата кредитной и накопительной картой
- case 3: PaymentCreditCard(cost - (decimal)AvailableAmountFuel, amount - Convert.ToInt32(Math.Truncate(Amount)), FuelID);
- amount = Convert.ToInt32(Math.Truncate(Amount));
- cost = (decimal)AvailableAmountFuel;
- break;
- }
- }
- RootDataOfRefuling rootDataOfRefuling = new RootDataOfRefuling
- {
- Car = Helper.FindCar,
- KeySession = Helper.KeySession,
- DataOfCamera = Helper.DataFromCamera,
- VolumeFuel = amount,
- CurrentFuelID = CurrentFuel.IDFuelType,
- GasStationID = Helper.CurrentGasStation.GasStationID
- };
- RootDataOfPayment rootDataOfPayment = new RootDataOfPayment()
- {
- RootDataOfCard = SavingCard,
- PriceRefueling = cost,
- Status = true,
- TransactionCode = DateTime.Now.ToString("ddMMyyyy-hhmmss"),
- RootDataOfRefuling = rootDataOfRefuling
- };
- PostDataOfPayment(JsonConvert.SerializeObject(rootDataOfPayment));
-
- }
- //Оплата кредитной картой заправки
- public void PaymentCreditCard(decimal cost, int amount, int FuelID)
- {
- var CurrentFuel = Helper.CurrentGasStation.FuelInCurrentGasStation.FirstOrDefault(x => x.IDFuelType == FuelID);
- if (CurrentFuel.AmountOfFuel < amount)
- {
- MessageBox.Show($"Не достаточно топлива в хранилище! Доступно {CurrentFuel.AmountOfFuel} л.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- var CreditCard = Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 2);
- if (CreditCard.Balance < cost)
- {
- MessageBox.Show($"Не достаточно средств на карте", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
- return;
- }
- RootDataOfRefuling rootDataOfRefuling = new RootDataOfRefuling
- {
- Car = Helper.FindCar,
- KeySession = Helper.KeySession,
- DataOfCamera = Helper.DataFromCamera,
- VolumeFuel = amount,
- CurrentFuelID= CurrentFuel.IDFuelType,
- GasStationID = Helper.CurrentGasStation.GasStationID
- };
- RootDataOfPayment rootDataOfPayment = new RootDataOfPayment()
- {
- RootDataOfCard = CreditCard,
- PriceRefueling = cost,
- Status = true,
- TransactionCode = DateTime.Now.ToString("ddMMyyyy-hhmmss"),
- RootDataOfRefuling = rootDataOfRefuling
- };
- PostDataOfPayment(JsonConvert.SerializeObject(rootDataOfPayment));
- }
-
- //Отправка данных об покупке топлива
- public async void PostDataOfPayment(string JsonDataOfPayment)
- {
- string IDGasStation = Helper.CurrentGasStation.GasStationID.ToString();
- if (IDGasStation.Length == 1)
- {
- IDGasStation = IDGasStation.Insert(0, "0");
- }
- string port = "102" + IDGasStation;
- IPEndPoint IpPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), Convert.ToInt32(port));
- Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- socket.Connect(IpPoint);
- string request = "POST data of payment=" + JsonDataOfPayment;
- byte[] data = Encoding.UTF8.GetBytes(request);
- socket.Send(data);
- data = new byte[256]; // буфер для ответа
- StringBuilder builder = new StringBuilder();
- int bytes = 0; // количество полученных байт
- do
- {
- bytes = socket.Receive(data, data.Length, 0);
- builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
- }
- while (socket.Available > 0);
- MessageBox.Show(builder.ToString());
- socket.Shutdown(SocketShutdown.Both);
- socket.Close();
- }
- private void CmbTypeOfRefueling_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (CmbTypeOfRefueling.SelectedIndex == 0)
- {
- TbAmount.Visibility = Visibility.Visible;
- TxtAmount.Visibility = Visibility.Hidden;
- TbCost.Visibility = Visibility.Hidden;
- TxtCost.Visibility = Visibility.Visible;
- }
- if (CmbTypeOfRefueling.SelectedIndex == 1)
- {
- TbAmount.Visibility = Visibility.Hidden;
- TxtAmount.Visibility = Visibility.Visible;
- TbCost.Visibility = Visibility.Visible;
- TxtCost.Visibility = Visibility.Hidden;
- }
- if (CmbTypeOfRefueling.SelectedIndex == 3)
- {
- TbAmount.Visibility = Visibility.Visible;
- TxtAmount.Visibility = Visibility.Hidden;
- TbCost.Visibility = Visibility.Hidden;
- TxtCost.Visibility = Visibility.Visible;
- TbAmount.Text = Helper.FindCar.VolumeTank.ToString();
- }
- }
- private void TbAmount_TextChanged(object sender, TextChangedEventArgs e)
- {
- if (TbAmount.Text.Length == 0)
- {
- TxtErroreMessage.Visibility = Visibility.Hidden;
- TxtCost.Text = string.Empty;
- return;
- }
- if (TbAmount.Text.All(char.IsDigit) == true)
- {
- TxtErroreMessage.Visibility = Visibility.Hidden;
- var CurrentFuel = CmbTypeOfFuel.SelectedItem as FuelInCurrentGasStation;
- double cost = Convert.ToInt32(TbAmount.Text) * CurrentFuel.Price;
- TxtCost.Text = cost.ToString("F2") + " руб.";
- }
- else
- {
- TxtErroreMessage.Text = "Не корректное количество!";
- TxtErroreMessage.Visibility = Visibility.Visible;
- }
- }
- private void TbCost_TextChanged(object sender, TextChangedEventArgs e)
- {
- if (TbCost.Text.Length == 0)
- {
- TxtErroreMessage.Visibility = Visibility.Hidden;
- TxtAmount.Text = string.Empty;
- return;
- }
- if (TbCost.Text.Any(char.IsLetter) == false)
- {
- TxtErroreMessage.Visibility = Visibility.Hidden;
- var CurrentFuel = CmbTypeOfFuel.SelectedItem as FuelInCurrentGasStation;
- double Amount = Convert.ToDouble(TbCost.Text) / CurrentFuel.Price;
- double CorrectCost = Math.Truncate(Amount) * CurrentFuel.Price;
- TbCost.Text = CorrectCost.ToString("F2");
- TxtAmount.Text = Convert.ToInt32(Math.Truncate(Amount)).ToString() + " л.";
- }
- else
- {
- TxtErroreMessage.Text = "Не корректная сумма!";
- TxtErroreMessage.Visibility = Visibility.Visible;
- }
- }
- private void CmbTypeOfPayment_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- if (CmbTypeOfPayment.SelectedValue.ToString() == "Банковской картой")
- {
- BtnEnterDataOfCard.Visibility = Visibility.Visible;
- }
- else
- {
- BtnEnterDataOfCard.Visibility = Visibility.Hidden;
- }
- }
- private void CmbTypeOfFuel_SelectionChanged(object sender, SelectionChangedEventArgs e)
- {
- TxtAmount.Text = "";
- TbAmount.Text = "";
- TxtCost.Text = "";
- TbCost.Text = "";
- }
- }
- }
|