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
{
///
/// Логика взаимодействия для RefuelingPage.xaml
///
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(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(builder.ToString());
AddTypeOFRefueling();
// закрываем сокет
socket.Shutdown(SocketShutdown.Both);
socket.Close();
}
//Задание ограничений по типам запрвки
public void AddTypeOFRefueling()
{
List TypeOfRefueling = new List();
TypeOfRefueling.Add("Фиксированный объем");
TypeOfRefueling.Add("Фиксированная цена");
TypeOfRefueling.Add("До полного бака с ограничением по объему");
List TypeOfPayment = new List();
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 = "";
}
}
}