Пример #1
0
 /// <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);
 }
Пример #2
0
        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);
        }
Пример #3
0
        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();
        }
Пример #4
0
        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);
        }
Пример #5
0
        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();
            }
        }
Пример #6
0
 /// <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);
 }