Program.cs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.IO;
  5. using System.Linq;
  6. using System.Net;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. namespace Server
  10. {
  11. class Program
  12. {
  13. public static gr672_pgvEntities db = new gr672_pgvEntities();
  14. static void Main(string[] args)
  15. {
  16. Listen();
  17. Console.Read();
  18. }
  19. public static async void Listen()
  20. {
  21. HttpListener listener = new HttpListener();
  22. listener.Prefixes.Add($"http://127.0.0.1:8080/");
  23. listener.Start();
  24. Console.WriteLine("Ожидание подключений...");
  25. while (true)
  26. {
  27. HttpListenerContext context = await listener.GetContextAsync();
  28. HttpListenerRequest request = context.Request;
  29. //Все заправочные станции на которых есть выбранный вид топлива
  30. if (request.RawUrl.Contains("/stations?fuel") && request.HttpMethod == "GET")
  31. {
  32. string NameFuel = request.RawUrl.Split('=')[1];
  33. HttpListenerResponse response = context.Response;
  34. List<RootFuelInStation> rootFuelInStations = new List<RootFuelInStation>();
  35. var GasStation = db.FuelTypeOnGasStation.Where(x => x.FuelType.NameFuelType == NameFuel).ToList();
  36. foreach (var item in GasStation)
  37. {
  38. rootFuelInStations.Add(new RootFuelInStation() { GasStationID = item.IDGasStation, Address = item.GasStation.Address, Price = item.Price });
  39. }
  40. var Json = JsonConvert.SerializeObject(rootFuelInStations);
  41. byte[] buffer = Encoding.UTF8.GetBytes(Json);
  42. response.ContentLength64 = buffer.Length;
  43. Stream output = response.OutputStream;
  44. output.Write(buffer, 0, buffer.Length);
  45. output.Close();
  46. Console.WriteLine($"{Json}");
  47. }
  48. //Информация о заправочной станции
  49. if (request.RawUrl.Contains("/getStationInfo?id") && request.HttpMethod == "GET")
  50. {
  51. int IDGasStation = Convert.ToInt32( request.RawUrl.Split('=')[1]);
  52. var GasStation = db.GasStation.Find(IDGasStation);
  53. if (GasStation == null)
  54. {
  55. HttpListenerResponse response = context.Response;
  56. byte[] buffer = Encoding.UTF8.GetBytes("АЗС не найдено");
  57. response.ContentLength64 = buffer.Length;
  58. Stream output = response.OutputStream;
  59. output.Write(buffer, 0, buffer.Length);
  60. output.Close();
  61. Console.WriteLine("АЗС не найдено");
  62. }
  63. else
  64. {
  65. RootDataOfGasStation dataOfGasStation = new RootDataOfGasStation();
  66. dataOfGasStation.GasStationID = GasStation.GasStationID;
  67. dataOfGasStation.Address = GasStation.Address;
  68. List<FuelInCurrentGasStation> rootFuelTypes = new List<FuelInCurrentGasStation>();
  69. foreach (var item in GasStation.FuelTypeOnGasStation)
  70. {
  71. rootFuelTypes.Add(new FuelInCurrentGasStation()
  72. { IDFuelType = item.IDFuelType, AmountOfFuel = item.AmountOfFuel, Price = item.Price, NameFuelType = item.FuelType.NameFuelType });
  73. }
  74. dataOfGasStation.FuelInCurrentGasStation = rootFuelTypes;
  75. var Json = JsonConvert.SerializeObject(dataOfGasStation);
  76. byte[] buffer = Encoding.UTF8.GetBytes(Json);
  77. HttpListenerResponse response = context.Response;
  78. response.ContentLength64 = buffer.Length;
  79. Stream output = response.OutputStream;
  80. output.Write(buffer, 0, buffer.Length);
  81. output.Close();
  82. Console.WriteLine($"{Json}");
  83. }
  84. }
  85. //Добавление или редактирование данных о заправочной станции
  86. if (request.RawUrl.Contains("/setStation") && request.HttpMethod == "POST")
  87. {
  88. StreamReader reader = new StreamReader(request.InputStream, Encoding.UTF8);
  89. string Json = await reader.ReadToEndAsync();
  90. RootDataOfGasStation DataOfGasStation = JsonConvert.DeserializeObject<RootDataOfGasStation>(Json);
  91. //Поиск заправочной станции
  92. var FindGasStation = db.GasStation.Find(DataOfGasStation.GasStationID);
  93. if (FindGasStation == null)
  94. {
  95. //Добавление новой заправочной станции
  96. GasStation NewGasStation = new GasStation()
  97. {
  98. GasStationID = DataOfGasStation.GasStationID,
  99. Address = DataOfGasStation.Address
  100. };
  101. db.GasStation.Add(NewGasStation);
  102. foreach (var item in DataOfGasStation.FuelInCurrentGasStation)
  103. {
  104. FuelTypeOnGasStation fuelTypeOnGasStation = new FuelTypeOnGasStation()
  105. {
  106. IDGasStation = NewGasStation.GasStationID,
  107. IDFuelType = item.IDFuelType,
  108. AmountOfFuel = item.AmountOfFuel,
  109. Price = item.Price
  110. };
  111. db.FuelTypeOnGasStation.Add(fuelTypeOnGasStation);
  112. }
  113. db.SaveChanges();
  114. }
  115. else
  116. {
  117. //Редактирование заправочной станции
  118. FindGasStation.GasStationID = DataOfGasStation.GasStationID;
  119. FindGasStation.Address = DataOfGasStation.Address;
  120. foreach (var item in DataOfGasStation.FuelInCurrentGasStation)
  121. {
  122. //Поиск цены на топливо
  123. FuelTypeOnGasStation FindfuelTypeOnGasStation = db.FuelTypeOnGasStation.
  124. FirstOrDefault(x => x.IDGasStation == FindGasStation.GasStationID && x.IDFuelType == item.IDFuelType);
  125. if (FindfuelTypeOnGasStation == null)
  126. {
  127. //Добавление цен на топливо
  128. FuelTypeOnGasStation fuelTypeOnGasStation = new FuelTypeOnGasStation()
  129. {
  130. IDGasStation = FindGasStation.GasStationID,
  131. IDFuelType = item.IDFuelType,
  132. AmountOfFuel = item.AmountOfFuel,
  133. Price = item.Price
  134. };
  135. db.FuelTypeOnGasStation.Add(fuelTypeOnGasStation);
  136. }
  137. else
  138. {
  139. //Редактирование цен на топливо
  140. FindfuelTypeOnGasStation.Price = item.Price;
  141. FindfuelTypeOnGasStation.AmountOfFuel = item.AmountOfFuel;
  142. }
  143. db.SaveChanges();
  144. }
  145. }
  146. HttpListenerResponse response = context.Response;
  147. byte[] buffer = Encoding.UTF8.GetBytes("Выполненно");
  148. response.ContentLength64 = buffer.Length;
  149. Stream output = response.OutputStream;
  150. output.Write(buffer, 0, buffer.Length);
  151. output.Close();
  152. Console.WriteLine("Выполненно");
  153. }
  154. //Получение данных с камеры, поиск машины в БД и при её отсутствии создаём новую запись о машине
  155. if (request.RawUrl.Contains("/FindOrAddCar") && request.HttpMethod == "POST")
  156. {
  157. StreamReader reader = new StreamReader(request.InputStream, Encoding.UTF8);
  158. string Json = await reader.ReadToEndAsync();
  159. DataOfCamera dataOfCamera = JsonConvert.DeserializeObject<DataOfCamera>(Json);
  160. Car FindCar = db.Car.FirstOrDefault(x => x.CarNumber == dataOfCamera.CarNumber);
  161. RootDataOfCar rootDataOfCar = new RootDataOfCar();
  162. if (FindCar == null)
  163. {
  164. Car ResponseCar = new Car { CarNumber = dataOfCamera.CarNumber, VolumeTank = null, IDClient = null};
  165. db.Car.Add(ResponseCar);
  166. db.SaveChanges();
  167. rootDataOfCar = new RootDataOfCar
  168. {
  169. CarID = ResponseCar.CarID,
  170. CarNumber = ResponseCar.CarNumber,
  171. VolumeTank = ResponseCar.VolumeTank,
  172. CardOfCars = null
  173. };
  174. }
  175. else
  176. {
  177. List<RootDataOfCard> CardOfCars = new List<RootDataOfCard>();
  178. if (FindCar.IDClient != null)
  179. {
  180. foreach (var item in FindCar.Client.Card.ToList())
  181. {
  182. CardOfCars.Add(new RootDataOfCard
  183. {
  184. CardID = item.CardID,
  185. CardExpDate = item.CardExpDate,
  186. Balance = item.Balance,
  187. CardHolder = item.Client.LastName + " " + item.Client.Name,
  188. IDCardIssuer = item.IDCardIssuer,
  189. IDCardType = item.IDCardType,
  190. NumberCard = item.NumberCard
  191. });
  192. }
  193. }
  194. rootDataOfCar = new RootDataOfCar
  195. {
  196. CarID = FindCar.CarID,
  197. CarNumber = FindCar.CarNumber,
  198. VolumeTank = FindCar.VolumeTank,
  199. CardOfCars = CardOfCars
  200. };
  201. }
  202. Json = JsonConvert.SerializeObject(rootDataOfCar);
  203. HttpListenerResponse response = context.Response;
  204. byte[] buffer = Encoding.UTF8.GetBytes(Json);
  205. response.ContentLength64 = buffer.Length;
  206. Stream output = response.OutputStream;
  207. output.Write(buffer, 0, buffer.Length);
  208. output.Close();
  209. Console.WriteLine(Json);
  210. }
  211. //Получение данных о об оплате заправке автомобиля
  212. if (request.RawUrl.Contains("PostDataOfPayment") && request.HttpMethod == "POST")
  213. {
  214. StreamReader streamReader = new StreamReader(request.InputStream, Encoding.UTF8);
  215. string Json = await streamReader.ReadToEndAsync();
  216. RootDataOfPayment dataOfPayment = JsonConvert.DeserializeObject<RootDataOfPayment>(Json);
  217. //Запись о заправке
  218. var RefuelingColumn = db.RefuelingColumn.FirstOrDefault(x=> x.IDGasStation == dataOfPayment.RootDataOfRefuling.GasStationID);
  219. var RefuelingGun = db.RefuelingGun.FirstOrDefault(x => x.IDFuelType == dataOfPayment.RootDataOfRefuling.CurrentFuelID && x.IDRefuelingColumn == RefuelingColumn.RefuelingColumnID);
  220. Refueling NewRefuling = new Refueling
  221. {
  222. IDCar = dataOfPayment.RootDataOfRefuling.Car.CarID,
  223. VolumeFuel = dataOfPayment.RootDataOfRefuling.VolumeFuel,
  224. DataOfCamera = dataOfPayment.RootDataOfRefuling.DataOfCamera,
  225. KeySession = dataOfPayment.RootDataOfRefuling.KeySession,
  226. IDRefulingGun = RefuelingGun.RefuelingGunID
  227. };
  228. db.Refueling.Add(NewRefuling);
  229. var FindCard = db.Card.FirstOrDefault(x => x.CardID == dataOfPayment.RootDataOfCard.CardID);
  230. string LastName = dataOfPayment.RootDataOfCard.CardHolder.Split(' ')[0];
  231. string Name = dataOfPayment.RootDataOfCard.CardHolder.Split(' ')[1];
  232. var FindClient = db.Client.FirstOrDefault(x => x.LastName == LastName && x.Name == Name);
  233. //Запись об оплате
  234. Payment NewPayment = new Payment()
  235. {
  236. IDRefueling = NewRefuling.RefuelingID,
  237. PriceRefueling = dataOfPayment.PriceRefueling,
  238. Status = dataOfPayment.Status,
  239. TransactionCode = dataOfPayment.TransactionCode,
  240. //Создание новой карты, если с неё раньше не производилось оплаты
  241. Card = FindCard is null ? new Card
  242. {
  243. NumberCard = dataOfPayment.RootDataOfCard.NumberCard,
  244. CardExpDate = dataOfPayment.RootDataOfCard.CardExpDate,
  245. Balance = dataOfPayment.RootDataOfCard.Balance - dataOfPayment.PriceRefueling,
  246. IDCardType = dataOfPayment.RootDataOfCard.IDCardType,
  247. IDCardIssuer = dataOfPayment.RootDataOfCard.IDCardIssuer,
  248. //Добавление нового клиента, если у него раньше не было карт
  249. Client = FindClient is null ? new Client { LastName = LastName, Name = Name } : FindClient
  250. } : FindCard
  251. };
  252. db.Payment.Add(NewPayment);
  253. //Списание топлива
  254. var CurrentFuelInGasStation = db.FuelTypeOnGasStation
  255. .FirstOrDefault(x => x.IDGasStation == dataOfPayment.RootDataOfRefuling.GasStationID &&
  256. x.IDFuelType == dataOfPayment.RootDataOfRefuling.CurrentFuelID);
  257. CurrentFuelInGasStation.AmountOfFuel = CurrentFuelInGasStation.AmountOfFuel - dataOfPayment.RootDataOfRefuling.VolumeFuel;
  258. //Списание средств с карты
  259. if (FindCard != null)
  260. {
  261. FindCard.Balance = FindCard.Balance - dataOfPayment.PriceRefueling;
  262. }
  263. db.SaveChanges();
  264. FindClient = db.Client.FirstOrDefault(x => x.LastName == LastName && x.Name == Name);
  265. //Запись о владельце автомобиля исходя из данных карты (Если это превая оплата с банковской карты)
  266. var FindCar = db.Car.Find(dataOfPayment.RootDataOfRefuling.Car.CarID);
  267. if (FindCar.IDClient is null)
  268. {
  269. FindCar.IDClient = FindClient.ClientID;
  270. }
  271. //if (dataOfPayment.RootDataOfCard.IDCardType == 2)
  272. //{
  273. // var FindSavingCard = db.Card.FirstOrDefault(x => x.IDHolder == FindClient.ClientID && x.IDCardType == 3);
  274. // if (FindSavingCard == null)
  275. // {
  276. // Random random = new Random();
  277. // string NumberCard = "";
  278. // for (int i = 0; i < 7; i++)
  279. // {
  280. // NumberCard += random.Next(0, 9).ToString();
  281. // }
  282. // Card NewCard = new Card
  283. // {
  284. // NumberCard = NumberCard,
  285. // CardExpDate = null,
  286. // Balance = 10,
  287. // IDCardType = 2,
  288. // IDCardIssuer = null,
  289. // IDHolder = FindClient.ClientID
  290. // };
  291. // db.Card.Add(NewCard);
  292. // }
  293. // else
  294. // {
  295. // FindSavingCard.Balance = FindSavingCard.Balance + FindCard.Balance * 3 / 100;
  296. // }
  297. //}
  298. //db.SaveChanges();
  299. HttpListenerResponse response = context.Response;
  300. byte[] buffer = Encoding.UTF8.GetBytes("Оплата прошла успешно");
  301. response.ContentLength64 = buffer.Length;
  302. Stream output = response.OutputStream;
  303. output.Write(buffer, 0, buffer.Length);
  304. output.Close();
  305. Console.WriteLine("Оплата прошла успешно");
  306. }
  307. }
  308. }
  309. }
  310. }