diff --git a/src/Controller/APIController.php b/src/Controller/APIController.php index 850bddd9..cc6e2ed3 100644 --- a/src/Controller/APIController.php +++ b/src/Controller/APIController.php @@ -37,6 +37,7 @@ use App\Service\MapTools; use App\Service\InventoryManager; use App\Service\RiderAssignmentHandlerInterface; use App\Service\HubSelector; +use App\Service\HubDistributor; use App\Entity\MobileSession; use App\Entity\Customer; @@ -2520,9 +2521,9 @@ class APIController extends Controller implements LoggedController // TODO: set this properly. This is test data $hub_criteria = new HubCriteria(); $hub_criteria->setPoint($jo->getCoordinates()) - ->setLimitResults(1) - ->setLimitDistance(5) - ->setInventoryCheck(true) + ->setLimitResults(50) + ->setLimitDistance(100) + ->setInventoryCheck(false) ->setJoType($jo->getServiceType()) ->setDateTime(new DateTime()); diff --git a/src/Service/HubDistributor.php b/src/Service/HubDistributor.php index acfafd1a..fb0bc3b1 100644 --- a/src/Service/HubDistributor.php +++ b/src/Service/HubDistributor.php @@ -2,8 +2,6 @@ namespace App\Service; -use Doctrine\ORM\EntityManagerInterface; - use App\Service\RedisClientProvider; use App\Entity\Hub; @@ -13,8 +11,7 @@ class HubDistributor protected $redis; protected $hub_jo_key; - public function __construct(RedisClientProvider $redis, - $hub_jo_key) + public function __construct(RedisClientProvider $redis, $hub_jo_key) { $this->redis = $redis->getRedisClient(); $this->hub_jo_key = $hub_jo_key; @@ -22,33 +19,69 @@ class HubDistributor public function addJoCountForHub(Hub $hub) { - $key = $hub->gtID(); + $key = $hub->getID(); // get current count - $result = $this->redis->hget($this->hub_jo_key, $key); - if ($result == true) - { - // hub exist in hash - // add to count - } - else + $jo_count = $this->redis->hget($this->hub_jo_key, $key); + if ($jo_count == false) { // hub not in hash // add hub to hash + // set to 1 since this is first jo for hub + $this->redis->hset($this->hub_jo_key, $key, 1); + } + else + { + // hub exist in hash + // add to count + $this->redis->hset($this->hub_jo_key, $key, $jo_count + 1); } } public function arrangeHubs($hubs) { + if (count($hubs) == 1) + return $hubs; + $arranged_hubs = []; foreach ($hubs as $hub_data) { $hub = $hub_data['hub']; - // get hub in hash + // need the id of hub + $key = $hub->getID(); + + // get jo count of hub + $hub_jo_count = $this->redis->hget($this->hub_jo_key, $key); + + // check if hub is in hash. if not, hub has no jobs + // but should still be added to results + $arranged_hubs[] = [ + 'hub' => $hub, + 'db_distance' => $hub_data['db_distance'], + 'distance' => $hub_data['distance'], + 'duration' => $hub_data['duration'], + 'jo_count' => 0, + ]; + + if ($hub_jo_count != null) + { + $arranged_hubs['jo_count'] = $hub_jo_count; + } } + usort($arranged_hubs, function($a, $b) { + if ($a['jo_count'] == $b['jo_count']) + return 0; + if ($a['jo_count'] < $b['jo_count']) + return -1; + else + return 1; + }); + + //error_log('arranged hubs ' . json_encode($arranged_hubs)); + return $arranged_hubs; } } diff --git a/src/Service/HubSelector.php b/src/Service/HubSelector.php index 58f8f99f..ececc91b 100644 --- a/src/Service/HubSelector.php +++ b/src/Service/HubSelector.php @@ -60,12 +60,16 @@ class HubSelector $hubs_round_robin = $this->filterHubsByRoundRobin($filtered_hubs); $filtered_hubs = $hubs_round_robin; + //error_log(json_encode($filtered_hubs)); + // max results filter $hubs_max_result = $this->filterHubsByMaxResults($filtered_hubs, $limit_results); $filtered_hubs = $hubs_max_result; $results = $filtered_hubs; + //error_log(json_encode($results)); + return $results; } @@ -93,7 +97,8 @@ class HubSelector $results = []; for ($i = 0; $i < $limit_result; $i++) { - $results[] = $hubs[$i]; + if ($i < count($hubs)) + $results[] = $hubs[$i]; } return $results;