/// <summary> /// Check if the car is near the address of the request /// </summary> /// <param name="car"></param> /// <returns></returns> public bool CarOnAddressCheck(Car car) { if (car.CarStatus == CarStatus.Busy) { var takenRequest = _data.TakenRequests.Where(x => x.Car.Id == car.Id).Include(x => x.Request).FirstOrDefault(); if (takenRequest == null) { car.CarStatus = CarStatus.Free; _data.SaveChanges(); } else { if (takenRequest.Request.RequestStatus == RequestStatusEnum.Taken) { var distance = DistanceBetweenTwoPoints.GetDistance(takenRequest.Request.StartingLocation, car.Location); if (distance < 0.020) { takenRequest.Request.RequestStatus = RequestStatusEnum.OnAddress; takenRequest.OnAddressDateTime = DateTime.Now; _data.SaveChanges(); return(true); } } } } return(false); }
private Car AppropriateCar(Models.Models.Location startingLocaion, RequestInfo request, Company company) { var nearBycars = _data.Cars.Where(x => x.Company.Id == company.Id).Where(x => x.CarStatus == CarStatus.Free).Where(x => Math.Abs(x.Location.Latitude - startingLocaion.Latitude) <= 0.0150 && Math.Abs(x.Location.Longitude - startingLocaion.Longitude) <= 0.0150).ToList(); var distances = new List <double>(); var dictionary = new Dictionary <double, Car>(); Car chosenCar = null; if (nearBycars.Count == 0) { return(null); } foreach (var item in nearBycars) { var distance = DistanceBetweenTwoPoints.GetDistance(startingLocaion, item.Location); distances.Add(distance); dictionary.Add(distance, item); } var sortedDistances = distances.OrderBy(x => x); foreach (var item in sortedDistances) { var car = dictionary[item]; if (!(_data.CarsDismissedRequests.Where(x => x.Request.Id == request.Id).Any(x => x.Car.Id == car.Id)) && !(_data.ActiveRequests.Any(x => x.AppropriateCar.Id == car.Id))) { chosenCar = car; } } return(chosenCar); }
private void NotTakenRequest(int requestId) { var activeRequest = _requestService.GetActiveRequests().Where(x => x.Request.Id == requestId).FirstOrDefault(); if (activeRequest?.Request != null) { var diff = DateTime.Now - activeRequest.DateTimeChosenCar; if (diff.TotalSeconds > 15) { _data.CarsDismissedRequests.Add(new CarDismissedRequest() { Car = activeRequest.AppropriateCar, Request = activeRequest.Request }); _data.SaveChanges(); var driver = _driverService.GetDriverByCar(activeRequest.AppropriateCar); var onlineDriver = _driverService.GetAllOnlineDrivers().Where(x => x.Driver.Id == driver.Id).FirstOrDefault(); if (onlineDriver != null) { Clients.Client(onlineDriver.ConnectionId).RequestTimeout(); } var newCar = _carService.AppropriateCar(activeRequest.Request.StartingLocation, activeRequest.Request, activeRequest.Request.Company); if (newCar == null) { activeRequest.Request.RequestStatus = RequestStatusEnum.NoCarChosen; activeRequest.AppropriateCar = null; activeRequest.DateTimeChosenCar = DateTime.Now; } else { activeRequest.AppropriateCar = newCar; activeRequest.DateTimeChosenCar = DateTime.Now; driver = _driverService.GetDriverByCar(activeRequest.AppropriateCar); onlineDriver = _driverService.GetAllOnlineDrivers().Where(x => x.Driver.Id == driver.Id).FirstOrDefault(); if (onlineDriver != null) { var distance = DistanceBetweenTwoPoints.GetDistance(activeRequest.Request.StartingLocation, activeRequest.AppropriateCar.Location); Clients.Client(onlineDriver.ConnectionId).ReceiveRequest(new ReceivedRequest() { Distance = distance, FinishAddress = activeRequest.Request.FinishAddress, StartingAddress = activeRequest.Request.StartingAddress } ); } } } } _data.SaveChanges(); }
public Car AppropriateCar(Models.Models.Location startingLocaion, Company company = null) { var nearBycars = new List <Car>(); if (company == null) { nearBycars = _data.Cars.Where(x => x.CarStatus == CarStatus.Free).Where(x => Math.Abs(x.Location.Latitude - startingLocaion.Latitude) <= 0.0300 && Math.Abs(x.Location.Longitude - startingLocaion.Longitude) <= 0.0300).ToList(); } else { nearBycars = _data.Cars.Where(x => x.Company.Id == company.Id).Where(x => x.CarStatus == CarStatus.Free).Where(x => Math.Abs(x.Location.Latitude - startingLocaion.Latitude) <= 0.0300 && Math.Abs(x.Location.Longitude - startingLocaion.Longitude) <= 0.0300).ToList(); } var distances = new List <double>(); var dictionary = new Dictionary <double, Car>(); Car appropriateCar = null; if (nearBycars.Count == 0) { return(null); } foreach (var item in nearBycars) { var distance = DistanceBetweenTwoPoints.GetDistance(startingLocaion, item.Location); distances.Add(distance); dictionary.Add(distance, item); } var sortedDistances = distances.OrderBy(x => x); foreach (var item in sortedDistances) { var car = dictionary[item]; if (!_data.ActiveRequests.Any(x => x.AppropriateCar.Id == car.Id)) { appropriateCar = car; break; } } return(appropriateCar); }
private void NoCarChosen(int requestId) { var actReque = _requestService.GetActiveRequests().Where(x => x.Request.Id == requestId).FirstOrDefault(); if (actReque?.Request != null) { var requestInfo = _requestService.GetRequestInfos().Where(x => x.Id == actReque.Request.Id).FirstOrDefault(); if (requestInfo?.Company != null) { var diff1 = DateTime.Now - actReque.DateTimeChosenCar; if (diff1.TotalSeconds > 90) { actReque.Request.RequestStatus = RequestStatusEnum.Dismissed; _requestService.RemoveActiveRequest(actReque); } else { var newCar = _carService.AppropriateCar(actReque.Request.StartingLocation, actReque.Request, requestInfo.Company); if (newCar != null) { actReque.AppropriateCar = newCar; actReque.DateTimeChosenCar = DateTime.Now; actReque.Request.RequestStatus = RequestStatusEnum.NotTaken; var driver = _driverService.GetDriverByCar(actReque.AppropriateCar); var onlineDriver = _driverService.GetAllOnlineDrivers().Where(x => x.Driver.Id == driver.Id).FirstOrDefault(); if (onlineDriver != null) { var distance = DistanceBetweenTwoPoints.GetDistance(actReque.Request.StartingLocation, actReque.AppropriateCar.Location); Clients.Client(onlineDriver.ConnectionId).ReceiveRequest(new ReceivedRequest() { Distance = distance, FinishAddress = actReque.Request.FinishAddress, StartingAddress = actReque.Request.StartingAddress } ); } } } } _data.SaveChanges(); } }
/// <summary> /// Return the request which is chosen as appropriate for the car as an object ready to be parsed to JSON /// </summary> /// <param name="car"></param> /// <returns></returns> public object AppropriateRequest(Car car) { if (data.ActiveRequests.Any(x => x.AppropriateCar.Id == car.Id)) { var request = data.ActiveRequests.Where(x => x.AppropriateCar.Id == car.Id).Include(x => x.Request).First(); if (request.Request.RequestStatus == RequestStatusEnum.NotTaken) { TimeSpan diff = DateTime.Now - request.DateTimeChosenCar; var distance = Math.Round(DistanceBetweenTwoPoints.GetDistance(request.Request.StartingLocation, new Models.Models.Location() { Latitude = car.Location.Latitude, Longitude = car.Location.Longitude }), 3); object requestObj = new { distance = distance, startAddress = request.Request.StartingAddress, finishAddress = request.Request.FinishAddress, id = request.Request.Id, time = 15 - Math.Round(diff.TotalSeconds, 0) }; return(requestObj); } else { request.AppropriateCar = null; data.SaveChanges(); } } return(null); }