RefuelingPage.xaml.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Net;
  6. using System.Net.Http;
  7. using System.Net.Sockets;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using System.Windows;
  11. using System.Windows.Controls;
  12. using System.Windows.Data;
  13. using System.Windows.Documents;
  14. using System.Windows.Input;
  15. using System.Windows.Media;
  16. using System.Windows.Media.Imaging;
  17. using System.Windows.Navigation;
  18. using System.Windows.Shapes;
  19. using System.Windows.Threading;
  20. namespace FillingColumn
  21. {
  22. /// <summary>
  23. /// Логика взаимодействия для RefuelingPage.xaml
  24. /// </summary>
  25. public partial class RefuelingPage : Page
  26. {
  27. public RefuelingPage()
  28. {
  29. InitializeComponent();
  30. var timer = new DispatcherTimer();
  31. timer.Interval = new TimeSpan(0, 0, 5);
  32. timer.IsEnabled = true;
  33. timer.Tick += Timer_Tick;
  34. timer.Start();
  35. AddTypeOFRefueling();
  36. CmbTypeOfFuel.ItemsSource = Helper.CurrentGasStation.FuelInCurrentGasStation;
  37. Title = $"Работа с колонкой на АЗС {Helper.CurrentGasStation.GasStationID}";
  38. }
  39. //Событие таймера
  40. private async void Timer_Tick(object sender, EventArgs e)
  41. {
  42. try
  43. {
  44. HttpClient client = new HttpClient();
  45. var response = await client.GetAsync("http://127.0.0.1:7070/getDataFromCamera/");
  46. var Body = await response.Content.ReadAsStringAsync();
  47. DataOfCamera dataFromCamera = JsonConvert.DeserializeObject<DataOfCamera>(Body);
  48. Helper.DataFromCamera = dataFromCamera;
  49. TxtDataOfCamera.Text = "Гос. номер распознан: " + dataFromCamera.CarNumber;
  50. FindCar(Body);
  51. }
  52. catch (Exception)
  53. {
  54. TxtDataOfCamera.Text = "Нет ответа от камеры";
  55. Helper.FindCar = null;
  56. }
  57. }
  58. public async void FindCar(string JsonDataOfCamera)
  59. {
  60. string IDGasStation = Helper.CurrentGasStation.GasStationID.ToString();
  61. if (IDGasStation.Length == 1)
  62. {
  63. IDGasStation = IDGasStation.Insert(0, "0");
  64. }
  65. string port = "102" + IDGasStation;
  66. IPEndPoint IpPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), Convert.ToInt32(port));
  67. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  68. socket.Connect(IpPoint);
  69. //Отправка данных с камеры на сервер АЗС
  70. string request = "POST data of camera=" + JsonDataOfCamera;
  71. byte[] data = Encoding.UTF8.GetBytes(request);
  72. socket.Send(data);
  73. //Получение ответа от сервера АЗС
  74. data = new byte[256]; // буфер для ответа
  75. StringBuilder builder = new StringBuilder();
  76. int bytes = 0; // количество полученных байт
  77. do
  78. {
  79. bytes = socket.Receive(data, data.Length, 0);
  80. builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
  81. }
  82. while (socket.Available > 0);
  83. //Десериализация данных о машине
  84. Helper.FindCar = JsonConvert.DeserializeObject<RootDataOfCar>(builder.ToString());
  85. AddTypeOFRefueling();
  86. // закрываем сокет
  87. socket.Shutdown(SocketShutdown.Both);
  88. socket.Close();
  89. }
  90. //Задание ограничений по типам запрвки
  91. public void AddTypeOFRefueling()
  92. {
  93. List<string> TypeOfRefueling = new List<string>();
  94. TypeOfRefueling.Add("Фиксированный объем");
  95. TypeOfRefueling.Add("Фиксированная цена");
  96. TypeOfRefueling.Add("До полного бака с ограничением по объему");
  97. List<string> TypeOfPayment = new List<string>();
  98. TypeOfPayment.Add("Банковской картой");
  99. if (Helper.FindCar != null)
  100. {
  101. if (Helper.FindCar.CardOfCars != null)
  102. {
  103. if (Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 3) != null)
  104. {
  105. TypeOfPayment.Add("Накопительной картой");
  106. }
  107. if (Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 1) != null)
  108. {
  109. TypeOfPayment.Add("Кредитной картой");
  110. }
  111. }
  112. }
  113. CmbTypeOfPayment.ItemsSource = TypeOfPayment;
  114. CmbTypeOfRefueling.ItemsSource = TypeOfRefueling;
  115. }
  116. private void BtnEnterDataOfCard_Click(object sender, RoutedEventArgs e)
  117. {
  118. AddDataOfCardWindow addDataOfCardWindow = new AddDataOfCardWindow();
  119. addDataOfCardWindow.ShowDialog();
  120. }
  121. private void BtnPayment_Click(object sender, RoutedEventArgs e)
  122. {
  123. if (TbAmount.Text == string.Empty && CmbTypeOfRefueling.SelectedIndex == 0)
  124. {
  125. MessageBox.Show("Не указан объём топлива", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  126. return;
  127. }
  128. if (TbCost.Text == string.Empty && CmbTypeOfRefueling.SelectedIndex == 1)
  129. {
  130. MessageBox.Show("Не указана стоимость для заправки", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  131. return;
  132. }
  133. if (TxtErroreMessage.Visibility == Visibility.Visible)
  134. {
  135. MessageBox.Show("Не корректные данные", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  136. return;
  137. }
  138. decimal cost = string.IsNullOrEmpty(TbCost.Text) ? Convert.ToDecimal(TxtCost.Text.Split(' ')[0]) : Convert.ToDecimal(TbCost.Text);
  139. int amount = string.IsNullOrEmpty(TbAmount.Text) ? Convert.ToInt32(TxtAmount.Text.Split(' ')[0]) : Convert.ToInt32(TbAmount.Text);
  140. int FuelID = (CmbTypeOfFuel.SelectedItem as FuelInCurrentGasStation).IDFuelType;
  141. switch (CmbTypeOfPayment.SelectedValue.ToString())
  142. {
  143. case "Банковской картой":
  144. PaymentBankCard(cost, amount, FuelID); break;
  145. case "Накопительной картой":
  146. PaymentSavingCard(cost, amount, FuelID); break;
  147. case "Кредитной картой":
  148. PaymentCreditCard(cost,amount, FuelID); break;
  149. }
  150. }
  151. //Оплат банковской картой
  152. public async void PaymentBankCard(decimal cost, int amount, int FuelID)
  153. {
  154. Helper.EnterPIN = string.Empty;
  155. if (Helper.EnterBankCard == null && Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 2) == null)
  156. {
  157. MessageBox.Show("Введите информацию о карте", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  158. return;
  159. }
  160. var CurrentFuel = Helper.CurrentGasStation.FuelInCurrentGasStation.FirstOrDefault(x => x.IDFuelType == FuelID);
  161. if (CurrentFuel.AmountOfFuel < amount)
  162. {
  163. MessageBox.Show($"Не достаточно топлива в хранилище! Доступно {CurrentFuel.AmountOfFuel} л.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  164. return;
  165. }
  166. var BankCard = Helper.EnterBankCard is null ? Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 2) : Helper.EnterBankCard;
  167. EnterPINWindow enterPINWindow = new EnterPINWindow();
  168. enterPINWindow.ShowDialog();
  169. if (Helper.EnterPIN == string.Empty)
  170. {
  171. MessageBox.Show("Введите ПИН", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  172. return;
  173. }
  174. DataOfPayment dataOfPayment = new DataOfPayment()
  175. {
  176. PriceRefueling = cost,
  177. NumberCard = BankCard.NumberCard,
  178. CardExpDate = BankCard.CardExpDate,
  179. Balance = BankCard.Balance,
  180. CardHolder = BankCard.CardHolder,
  181. KeySession = Helper.KeySession,
  182. PIN = Helper.EnterPIN
  183. };
  184. HttpClient BankClient = new HttpClient();
  185. string Json = JsonConvert.SerializeObject(dataOfPayment);
  186. StringContent content = new StringContent(Json, Encoding.UTF8);
  187. var response = await BankClient.PostAsync($"http://127.0.0.1:8081/pay", content);
  188. var ResponseMessage = await response.Content.ReadAsStringAsync();
  189. MessageBox.Show($"{ResponseMessage}", "Информация", MessageBoxButton.OK, MessageBoxImage.Information);
  190. if (ResponseMessage.Contains("Отклонено")) return;
  191. RootDataOfRefuling rootDataOfRefuling = new RootDataOfRefuling
  192. {
  193. Car = Helper.FindCar,
  194. KeySession = Helper.KeySession,
  195. DataOfCamera = Helper.DataFromCamera,
  196. VolumeFuel = amount,
  197. CurrentFuelID = CurrentFuel.IDFuelType,
  198. GasStationID = Helper.CurrentGasStation.GasStationID
  199. };
  200. RootDataOfPayment rootDataOfPayment = new RootDataOfPayment()
  201. {
  202. RootDataOfCard = BankCard,
  203. PriceRefueling = cost,
  204. Status = true,
  205. TransactionCode = DateTime.Now.ToString("ddMMyyyy-hhmmss"),
  206. RootDataOfRefuling = rootDataOfRefuling
  207. };
  208. PostDataOfPayment(JsonConvert.SerializeObject(rootDataOfPayment));
  209. }
  210. //Оплата накопительной картой
  211. public void PaymentSavingCard(decimal cost, int amount, int FuelID)
  212. {
  213. var CurrentFuel = Helper.CurrentGasStation.FuelInCurrentGasStation.FirstOrDefault(x => x.IDFuelType == FuelID);
  214. if( CurrentFuel.AmountOfFuel < amount)
  215. {
  216. MessageBox.Show($"Не достаточно топлива в хранилище! Доступно {CurrentFuel.AmountOfFuel} л.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  217. return;
  218. }
  219. var SavingCard = Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 3);
  220. if (SavingCard.Balance < cost)
  221. {
  222. double Amount = Convert.ToDouble(SavingCard.Balance) / CurrentFuel.Price;
  223. double AvailableAmountFuel = Math.Truncate(Amount) * CurrentFuel.Price;
  224. bool CreditCardIsEnable = Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 3) is null ? false : true;
  225. decimal MissingAmount = cost - SavingCard.Balance;
  226. if (Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 3).Balance < MissingAmount)
  227. {
  228. CreditCardIsEnable = false;
  229. }
  230. NoMoneyWindow noMoneyWindow = new NoMoneyWindow(MissingAmount, CreditCardIsEnable, Convert.ToInt32(Math.Truncate(Amount)));
  231. noMoneyWindow.ShowDialog();
  232. if (Helper.TypeOfNoMoney == 0)
  233. {
  234. return;
  235. }
  236. switch (Helper.TypeOfNoMoney)
  237. {
  238. //Оплата кредитной картой
  239. case 1:
  240. PaymentBankCard(cost, amount, FuelID);
  241. break;
  242. //Оплата на все накопленные бонусы
  243. case 2: amount = Convert.ToInt32(Math.Truncate(Amount));
  244. cost = (decimal)AvailableAmountFuel;
  245. break;
  246. //Оплата кредитной и накопительной картой
  247. case 3: PaymentCreditCard(cost - (decimal)AvailableAmountFuel, amount - Convert.ToInt32(Math.Truncate(Amount)), FuelID);
  248. amount = Convert.ToInt32(Math.Truncate(Amount));
  249. cost = (decimal)AvailableAmountFuel;
  250. break;
  251. }
  252. }
  253. RootDataOfRefuling rootDataOfRefuling = new RootDataOfRefuling
  254. {
  255. Car = Helper.FindCar,
  256. KeySession = Helper.KeySession,
  257. DataOfCamera = Helper.DataFromCamera,
  258. VolumeFuel = amount,
  259. CurrentFuelID = CurrentFuel.IDFuelType,
  260. GasStationID = Helper.CurrentGasStation.GasStationID
  261. };
  262. RootDataOfPayment rootDataOfPayment = new RootDataOfPayment()
  263. {
  264. RootDataOfCard = SavingCard,
  265. PriceRefueling = cost,
  266. Status = true,
  267. TransactionCode = DateTime.Now.ToString("ddMMyyyy-hhmmss"),
  268. RootDataOfRefuling = rootDataOfRefuling
  269. };
  270. PostDataOfPayment(JsonConvert.SerializeObject(rootDataOfPayment));
  271. }
  272. //Оплата кредитной картой заправки
  273. public void PaymentCreditCard(decimal cost, int amount, int FuelID)
  274. {
  275. var CurrentFuel = Helper.CurrentGasStation.FuelInCurrentGasStation.FirstOrDefault(x => x.IDFuelType == FuelID);
  276. if (CurrentFuel.AmountOfFuel < amount)
  277. {
  278. MessageBox.Show($"Не достаточно топлива в хранилище! Доступно {CurrentFuel.AmountOfFuel} л.", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  279. return;
  280. }
  281. var CreditCard = Helper.FindCar.CardOfCars.FirstOrDefault(x => x.IDCardType == 2);
  282. if (CreditCard.Balance < cost)
  283. {
  284. MessageBox.Show($"Не достаточно средств на карте", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
  285. return;
  286. }
  287. RootDataOfRefuling rootDataOfRefuling = new RootDataOfRefuling
  288. {
  289. Car = Helper.FindCar,
  290. KeySession = Helper.KeySession,
  291. DataOfCamera = Helper.DataFromCamera,
  292. VolumeFuel = amount,
  293. CurrentFuelID= CurrentFuel.IDFuelType,
  294. GasStationID = Helper.CurrentGasStation.GasStationID
  295. };
  296. RootDataOfPayment rootDataOfPayment = new RootDataOfPayment()
  297. {
  298. RootDataOfCard = CreditCard,
  299. PriceRefueling = cost,
  300. Status = true,
  301. TransactionCode = DateTime.Now.ToString("ddMMyyyy-hhmmss"),
  302. RootDataOfRefuling = rootDataOfRefuling
  303. };
  304. PostDataOfPayment(JsonConvert.SerializeObject(rootDataOfPayment));
  305. }
  306. //Отправка данных об покупке топлива
  307. public async void PostDataOfPayment(string JsonDataOfPayment)
  308. {
  309. string IDGasStation = Helper.CurrentGasStation.GasStationID.ToString();
  310. if (IDGasStation.Length == 1)
  311. {
  312. IDGasStation = IDGasStation.Insert(0, "0");
  313. }
  314. string port = "102" + IDGasStation;
  315. IPEndPoint IpPoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), Convert.ToInt32(port));
  316. Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  317. socket.Connect(IpPoint);
  318. string request = "POST data of payment=" + JsonDataOfPayment;
  319. byte[] data = Encoding.UTF8.GetBytes(request);
  320. socket.Send(data);
  321. data = new byte[256]; // буфер для ответа
  322. StringBuilder builder = new StringBuilder();
  323. int bytes = 0; // количество полученных байт
  324. do
  325. {
  326. bytes = socket.Receive(data, data.Length, 0);
  327. builder.Append(Encoding.UTF8.GetString(data, 0, bytes));
  328. }
  329. while (socket.Available > 0);
  330. MessageBox.Show(builder.ToString());
  331. socket.Shutdown(SocketShutdown.Both);
  332. socket.Close();
  333. }
  334. private void CmbTypeOfRefueling_SelectionChanged(object sender, SelectionChangedEventArgs e)
  335. {
  336. if (CmbTypeOfRefueling.SelectedIndex == 0)
  337. {
  338. TbAmount.Visibility = Visibility.Visible;
  339. TxtAmount.Visibility = Visibility.Hidden;
  340. TbCost.Visibility = Visibility.Hidden;
  341. TxtCost.Visibility = Visibility.Visible;
  342. }
  343. if (CmbTypeOfRefueling.SelectedIndex == 1)
  344. {
  345. TbAmount.Visibility = Visibility.Hidden;
  346. TxtAmount.Visibility = Visibility.Visible;
  347. TbCost.Visibility = Visibility.Visible;
  348. TxtCost.Visibility = Visibility.Hidden;
  349. }
  350. if (CmbTypeOfRefueling.SelectedIndex == 3)
  351. {
  352. TbAmount.Visibility = Visibility.Visible;
  353. TxtAmount.Visibility = Visibility.Hidden;
  354. TbCost.Visibility = Visibility.Hidden;
  355. TxtCost.Visibility = Visibility.Visible;
  356. TbAmount.Text = Helper.FindCar.VolumeTank.ToString();
  357. }
  358. }
  359. private void TbAmount_TextChanged(object sender, TextChangedEventArgs e)
  360. {
  361. if (TbAmount.Text.Length == 0)
  362. {
  363. TxtErroreMessage.Visibility = Visibility.Hidden;
  364. TxtCost.Text = string.Empty;
  365. return;
  366. }
  367. if (TbAmount.Text.All(char.IsDigit) == true)
  368. {
  369. TxtErroreMessage.Visibility = Visibility.Hidden;
  370. var CurrentFuel = CmbTypeOfFuel.SelectedItem as FuelInCurrentGasStation;
  371. double cost = Convert.ToInt32(TbAmount.Text) * CurrentFuel.Price;
  372. TxtCost.Text = cost.ToString("F2") + " руб.";
  373. }
  374. else
  375. {
  376. TxtErroreMessage.Text = "Не корректное количество!";
  377. TxtErroreMessage.Visibility = Visibility.Visible;
  378. }
  379. }
  380. private void TbCost_TextChanged(object sender, TextChangedEventArgs e)
  381. {
  382. if (TbCost.Text.Length == 0)
  383. {
  384. TxtErroreMessage.Visibility = Visibility.Hidden;
  385. TxtAmount.Text = string.Empty;
  386. return;
  387. }
  388. if (TbCost.Text.Any(char.IsLetter) == false)
  389. {
  390. TxtErroreMessage.Visibility = Visibility.Hidden;
  391. var CurrentFuel = CmbTypeOfFuel.SelectedItem as FuelInCurrentGasStation;
  392. double Amount = Convert.ToDouble(TbCost.Text) / CurrentFuel.Price;
  393. double CorrectCost = Math.Truncate(Amount) * CurrentFuel.Price;
  394. TbCost.Text = CorrectCost.ToString("F2");
  395. TxtAmount.Text = Convert.ToInt32(Math.Truncate(Amount)).ToString() + " л.";
  396. }
  397. else
  398. {
  399. TxtErroreMessage.Text = "Не корректная сумма!";
  400. TxtErroreMessage.Visibility = Visibility.Visible;
  401. }
  402. }
  403. private void CmbTypeOfPayment_SelectionChanged(object sender, SelectionChangedEventArgs e)
  404. {
  405. if (CmbTypeOfPayment.SelectedValue.ToString() == "Банковской картой")
  406. {
  407. BtnEnterDataOfCard.Visibility = Visibility.Visible;
  408. }
  409. else
  410. {
  411. BtnEnterDataOfCard.Visibility = Visibility.Hidden;
  412. }
  413. }
  414. private void CmbTypeOfFuel_SelectionChanged(object sender, SelectionChangedEventArgs e)
  415. {
  416. TxtAmount.Text = "";
  417. TbAmount.Text = "";
  418. TxtCost.Text = "";
  419. TbCost.Text = "";
  420. }
  421. }
  422. }