using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace Server { class Program { public static gr672_pgvEntities db = new gr672_pgvEntities(); static void Main(string[] args) { Listen(); Console.Read(); } public static async void Listen() { HttpListener listener = new HttpListener(); listener.Prefixes.Add($"http://127.0.0.1:8080/"); listener.Start(); Console.WriteLine("Ожидание подключений..."); while (true) { HttpListenerContext context = await listener.GetContextAsync(); HttpListenerRequest request = context.Request; //Все заправочные станции на которых есть выбранный вид топлива if (request.RawUrl.Contains("/stations?fuel") && request.HttpMethod == "GET") { string NameFuel = request.RawUrl.Split('=')[1]; HttpListenerResponse response = context.Response; List rootFuelInStations = new List(); var GasStation = db.FuelTypeOnGasStation.Where(x => x.FuelType.NameFuelType == NameFuel).ToList(); foreach (var item in GasStation) { rootFuelInStations.Add(new RootFuelInStation() { GasStationID = item.IDGasStation, Address = item.GasStation.Address, Price = item.Price }); } var Json = JsonConvert.SerializeObject(rootFuelInStations); byte[] buffer = Encoding.UTF8.GetBytes(Json); response.ContentLength64 = buffer.Length; Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); Console.WriteLine($"{Json}"); } //Информация о заправочной станции if (request.RawUrl.Contains("/getStationInfo?id") && request.HttpMethod == "GET") { int IDGasStation = Convert.ToInt32( request.RawUrl.Split('=')[1]); var GasStation = db.GasStation.Find(IDGasStation); if (GasStation == null) { HttpListenerResponse response = context.Response; byte[] buffer = Encoding.UTF8.GetBytes("АЗС не найдено"); response.ContentLength64 = buffer.Length; Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); Console.WriteLine("АЗС не найдено"); } else { RootDataOfGasStation dataOfGasStation = new RootDataOfGasStation(); dataOfGasStation.GasStationID = GasStation.GasStationID; dataOfGasStation.Address = GasStation.Address; List rootFuelTypes = new List(); foreach (var item in GasStation.FuelTypeOnGasStation) { rootFuelTypes.Add(new FuelInCurrentGasStation() { IDFuelType = item.IDFuelType, AmountOfFuel = item.AmountOfFuel, Price = item.Price, NameFuelType = item.FuelType.NameFuelType }); } dataOfGasStation.FuelInCurrentGasStation = rootFuelTypes; var Json = JsonConvert.SerializeObject(dataOfGasStation); byte[] buffer = Encoding.UTF8.GetBytes(Json); HttpListenerResponse response = context.Response; response.ContentLength64 = buffer.Length; Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); Console.WriteLine($"{Json}"); } } //Добавление или редактирование данных о заправочной станции if (request.RawUrl.Contains("/setStation") && request.HttpMethod == "POST") { StreamReader reader = new StreamReader(request.InputStream, Encoding.UTF8); string Json = await reader.ReadToEndAsync(); RootDataOfGasStation DataOfGasStation = JsonConvert.DeserializeObject(Json); //Поиск заправочной станции var FindGasStation = db.GasStation.Find(DataOfGasStation.GasStationID); if (FindGasStation == null) { //Добавление новой заправочной станции GasStation NewGasStation = new GasStation() { GasStationID = DataOfGasStation.GasStationID, Address = DataOfGasStation.Address }; db.GasStation.Add(NewGasStation); foreach (var item in DataOfGasStation.FuelInCurrentGasStation) { FuelTypeOnGasStation fuelTypeOnGasStation = new FuelTypeOnGasStation() { IDGasStation = NewGasStation.GasStationID, IDFuelType = item.IDFuelType, AmountOfFuel = item.AmountOfFuel, Price = item.Price }; db.FuelTypeOnGasStation.Add(fuelTypeOnGasStation); } db.SaveChanges(); } else { //Редактирование заправочной станции FindGasStation.GasStationID = DataOfGasStation.GasStationID; FindGasStation.Address = DataOfGasStation.Address; foreach (var item in DataOfGasStation.FuelInCurrentGasStation) { //Поиск цены на топливо FuelTypeOnGasStation FindfuelTypeOnGasStation = db.FuelTypeOnGasStation. FirstOrDefault(x => x.IDGasStation == FindGasStation.GasStationID && x.IDFuelType == item.IDFuelType); if (FindfuelTypeOnGasStation == null) { //Добавление цен на топливо FuelTypeOnGasStation fuelTypeOnGasStation = new FuelTypeOnGasStation() { IDGasStation = FindGasStation.GasStationID, IDFuelType = item.IDFuelType, AmountOfFuel = item.AmountOfFuel, Price = item.Price }; db.FuelTypeOnGasStation.Add(fuelTypeOnGasStation); } else { //Редактирование цен на топливо FindfuelTypeOnGasStation.Price = item.Price; FindfuelTypeOnGasStation.AmountOfFuel = item.AmountOfFuel; } db.SaveChanges(); } } HttpListenerResponse response = context.Response; byte[] buffer = Encoding.UTF8.GetBytes("Выполненно"); response.ContentLength64 = buffer.Length; Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); Console.WriteLine("Выполненно"); } //Получение данных с камеры, поиск машины в БД и при её отсутствии создаём новую запись о машине if (request.RawUrl.Contains("/FindOrAddCar") && request.HttpMethod == "POST") { StreamReader reader = new StreamReader(request.InputStream, Encoding.UTF8); string Json = await reader.ReadToEndAsync(); DataOfCamera dataOfCamera = JsonConvert.DeserializeObject(Json); Car FindCar = db.Car.FirstOrDefault(x => x.CarNumber == dataOfCamera.CarNumber); RootDataOfCar rootDataOfCar = new RootDataOfCar(); if (FindCar == null) { Car ResponseCar = new Car { CarNumber = dataOfCamera.CarNumber, VolumeTank = null, IDClient = null}; db.Car.Add(ResponseCar); db.SaveChanges(); rootDataOfCar = new RootDataOfCar { CarID = ResponseCar.CarID, CarNumber = ResponseCar.CarNumber, VolumeTank = ResponseCar.VolumeTank, CardOfCars = null }; } else { List CardOfCars = new List(); if (FindCar.IDClient != null) { foreach (var item in FindCar.Client.Card.ToList()) { CardOfCars.Add(new RootDataOfCard { CardID = item.CardID, CardExpDate = item.CardExpDate, Balance = item.Balance, CardHolder = item.Client.LastName + " " + item.Client.Name, IDCardIssuer = item.IDCardIssuer, IDCardType = item.IDCardType, NumberCard = item.NumberCard }); } } rootDataOfCar = new RootDataOfCar { CarID = FindCar.CarID, CarNumber = FindCar.CarNumber, VolumeTank = FindCar.VolumeTank, CardOfCars = CardOfCars }; } Json = JsonConvert.SerializeObject(rootDataOfCar); HttpListenerResponse response = context.Response; byte[] buffer = Encoding.UTF8.GetBytes(Json); response.ContentLength64 = buffer.Length; Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); Console.WriteLine(Json); } //Получение данных о об оплате заправке автомобиля if (request.RawUrl.Contains("PostDataOfPayment") && request.HttpMethod == "POST") { StreamReader streamReader = new StreamReader(request.InputStream, Encoding.UTF8); string Json = await streamReader.ReadToEndAsync(); RootDataOfPayment dataOfPayment = JsonConvert.DeserializeObject(Json); //Запись о заправке var RefuelingColumn = db.RefuelingColumn.FirstOrDefault(x=> x.IDGasStation == dataOfPayment.RootDataOfRefuling.GasStationID); var RefuelingGun = db.RefuelingGun.FirstOrDefault(x => x.IDFuelType == dataOfPayment.RootDataOfRefuling.CurrentFuelID && x.IDRefuelingColumn == RefuelingColumn.RefuelingColumnID); Refueling NewRefuling = new Refueling { IDCar = dataOfPayment.RootDataOfRefuling.Car.CarID, VolumeFuel = dataOfPayment.RootDataOfRefuling.VolumeFuel, DataOfCamera = dataOfPayment.RootDataOfRefuling.DataOfCamera, KeySession = dataOfPayment.RootDataOfRefuling.KeySession, IDRefulingGun = RefuelingGun.RefuelingGunID }; db.Refueling.Add(NewRefuling); var FindCard = db.Card.FirstOrDefault(x => x.CardID == dataOfPayment.RootDataOfCard.CardID); string LastName = dataOfPayment.RootDataOfCard.CardHolder.Split(' ')[0]; string Name = dataOfPayment.RootDataOfCard.CardHolder.Split(' ')[1]; var FindClient = db.Client.FirstOrDefault(x => x.LastName == LastName && x.Name == Name); //Запись об оплате Payment NewPayment = new Payment() { IDRefueling = NewRefuling.RefuelingID, PriceRefueling = dataOfPayment.PriceRefueling, Status = dataOfPayment.Status, TransactionCode = dataOfPayment.TransactionCode, //Создание новой карты, если с неё раньше не производилось оплаты Card = FindCard is null ? new Card { NumberCard = dataOfPayment.RootDataOfCard.NumberCard, CardExpDate = dataOfPayment.RootDataOfCard.CardExpDate, Balance = dataOfPayment.RootDataOfCard.Balance - dataOfPayment.PriceRefueling, IDCardType = dataOfPayment.RootDataOfCard.IDCardType, IDCardIssuer = dataOfPayment.RootDataOfCard.IDCardIssuer, //Добавление нового клиента, если у него раньше не было карт Client = FindClient is null ? new Client { LastName = LastName, Name = Name } : FindClient } : FindCard }; db.Payment.Add(NewPayment); //Списание топлива var CurrentFuelInGasStation = db.FuelTypeOnGasStation .FirstOrDefault(x => x.IDGasStation == dataOfPayment.RootDataOfRefuling.GasStationID && x.IDFuelType == dataOfPayment.RootDataOfRefuling.CurrentFuelID); CurrentFuelInGasStation.AmountOfFuel = CurrentFuelInGasStation.AmountOfFuel - dataOfPayment.RootDataOfRefuling.VolumeFuel; //Списание средств с карты if (FindCard != null) { FindCard.Balance = FindCard.Balance - dataOfPayment.PriceRefueling; } db.SaveChanges(); FindClient = db.Client.FirstOrDefault(x => x.LastName == LastName && x.Name == Name); //Запись о владельце автомобиля исходя из данных карты (Если это превая оплата с банковской карты) var FindCar = db.Car.Find(dataOfPayment.RootDataOfRefuling.Car.CarID); if (FindCar.IDClient is null) { FindCar.IDClient = FindClient.ClientID; } //if (dataOfPayment.RootDataOfCard.IDCardType == 2) //{ // var FindSavingCard = db.Card.FirstOrDefault(x => x.IDHolder == FindClient.ClientID && x.IDCardType == 3); // if (FindSavingCard == null) // { // Random random = new Random(); // string NumberCard = ""; // for (int i = 0; i < 7; i++) // { // NumberCard += random.Next(0, 9).ToString(); // } // Card NewCard = new Card // { // NumberCard = NumberCard, // CardExpDate = null, // Balance = 10, // IDCardType = 2, // IDCardIssuer = null, // IDHolder = FindClient.ClientID // }; // db.Card.Add(NewCard); // } // else // { // FindSavingCard.Balance = FindSavingCard.Balance + FindCard.Balance * 3 / 100; // } //} //db.SaveChanges(); HttpListenerResponse response = context.Response; byte[] buffer = Encoding.UTF8.GetBytes("Оплата прошла успешно"); response.ContentLength64 = buffer.Length; Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); Console.WriteLine("Оплата прошла успешно"); } } } } }