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);
                }
            }
        }
示例#3
0
        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);
            }
        }