private double CalculateWarpedTimeUntilEndOfWorkingDay(Vehicle vehicle) { var totalDistance = _shippingPlannerService.CalculateRouteDistance(_shippingPlannerService.GetCourierRouteCoords(vehicle)); var timeInHours = totalDistance / vehicle.AverageVelocity; var timeInMs = timeInHours * 60 * 60 * 1000 / timeWarpFactor; return(timeInMs); }
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); } } }