public bool CheckIfPackageCanBeDeliveredAtAll(Address receiverAddress, Address senderAddress) { List <Vehicle> vehicles; using (var context = _dbContextFactoryMethod()) { vehicles = context.Vehicles .AsQueryable() .Include(x => x.Driver) .ThenInclude(x => x.Address) .ToList(); } foreach (var vehicle in vehicles) { var maxTotalDistance = vehicle.AverageVelocity * _packageDeliveryConfigValues.WorkingHours; var totalDistanceToCover = _geoMapService.CalculateDistanceBetweenTwoPoints(vehicle.Driver.Address.Latitude, vehicle.Driver.Address.Longitude, senderAddress.Latitude, senderAddress.Longitude) + _geoMapService.CalculateDistanceBetweenTwoPoints(senderAddress.Latitude, senderAddress.Longitude, receiverAddress.Latitude, receiverAddress.Longitude) + _geoMapService.CalculateDistanceBetweenTwoPoints(receiverAddress.Latitude, receiverAddress.Longitude, vehicle.Driver.Address.Latitude, vehicle.Driver.Address.Longitude); if (totalDistanceToCover <= maxTotalDistance) { return(true); } } return(false); }
public void AddPackagesToPackingList(List <Package> packages, List <Vehicle> vehicles) { foreach (var package in packages) { double minDistance = double.MaxValue; Vehicle courierVehicle = null; foreach (var vehicle in vehicles) { var distance = _geoMapService.CalculateDistanceBetweenTwoPoints(package.Sender.Address.Latitude, package.Sender.Address.Longitude, vehicle.Driver.Address.Latitude, vehicle.Driver.Address.Longitude); if (distance < minDistance && distance < _packageDeliveryConfigValues.MaxDistanceToPickupPackage) { minDistance = distance; courierVehicle = vehicle; } } var maxDistancePossibleToCover = courierVehicle.AverageVelocity * _packageDeliveryConfigValues.WorkingHours; courierVehicle.CurrentLoad = _vehicleService.GetVehicleCurrentLoad(courierVehicle); courierVehicle.CourierPackingList.Add(package); List <GeoCoords> addressesToVisit = _shippingPlannerService.GetCourierRouteCoords(courierVehicle); courierVehicle.CourierPackingList.Remove(package); courierVehicle.DistanceToCover = _shippingPlannerService.CalculateRouteDistance(addressesToVisit); if (courierVehicle.LoadCapacity >= courierVehicle.CurrentLoad + (int)package.Weight && courierVehicle.DistanceToCover <= maxDistancePossibleToCover && courierVehicle != null) { _packageService.AddPackageToVehiclePackingList(package, courierVehicle); package.State = Package.PackageState.AddedToPackingList; _packageService.UpdatePackage(package); } else { package.Priority = Package.PackagePriority.High; _packageService.UpdatePackage(package); } } }
public bool CheckIfAddressIsInPickUpRangeOfAnyCourier(Address packageAddress) { using (var context = _UPSikDbContextFactoryMethod()) { var couriersAdresses = context.Users .Include(x => x.Address) .Where(x => x.Type == User.UserType.Courier) .Select(x => x.Address) .ToList(); foreach (var courierAdress in couriersAdresses) { var distance = _geoMapService.CalculateDistanceBetweenTwoPoints(courierAdress.Latitude, courierAdress.Longitude, packageAddress.Latitude, packageAddress.Longitude); if (distance < _packageDeliveryConfigValues.MaxDistanceToPickupPackage) { return(true); } } return(false); } }