From 4719d8936862f9a1f5d3a9e6e532d785fab9947f Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Tue, 28 Jan 2020 04:32:05 +0800 Subject: [PATCH] Add rider cache service #299 --- config/services.yaml | 8 +++- public/assets/js/dashboard_map.js | 17 ++++++- public/assets/js/map_mqtt.js | 2 +- src/Controller/HomeController.php | 24 ++++++++-- src/Controller/RAPIController.php | 13 +++++- src/Service/JobOrderCache.php | 2 +- src/Service/RiderCache.php | 78 +++++++++++++++++++++++++++++++ 7 files changed, 134 insertions(+), 10 deletions(-) create mode 100644 src/Service/RiderCache.php diff --git a/config/services.yaml b/config/services.yaml index cb7b5197..0b7669fd 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -222,4 +222,10 @@ services: App\Service\JobOrderCache: arguments: $redis_prov: "@App\\Service\\RedisClientProvider" - $active_jo_key: "%env(JO_ACTIVE_CACHE_KEY)%" + $active_jo_key: "%env(LOCATION_JO_ACTIVE_KEY)%" + + App\Service\RiderCache: + arguments: + $redis_prov: "@App\\Service\\RedisClientProvider" + $loc_key: "%env(LOCATION_RIDER_ACTIVE_KEY)%" + $status_key: "%env(STATUS_RIDER_KEY)%" diff --git a/public/assets/js/dashboard_map.js b/public/assets/js/dashboard_map.js index b3e03735..57d3c7a3 100644 --- a/public/assets/js/dashboard_map.js +++ b/public/assets/js/dashboard_map.js @@ -136,10 +136,12 @@ class DashboardMap { my.layer_groups.rider_available.clearLayers(); my.layer_groups.rider_active_jo.clearLayers(); my.layer_groups.customer.clearLayers(); - // get riders and mark + + // get riders and job orders var riders = response.riders; var jos = response.jos; + // job orders $.each(jos, function(id, data) { var lat = data.latitude; var lng = data.longitude; @@ -147,6 +149,18 @@ class DashboardMap { my.putCustomerMarker(id, lat, lng); }); + // riders + $.each(riders, function(id, data) { + var lat = data.latitude; + var lng = data.longitude; + + if (data.has_jo) + my.putRiderActiveJOMarker(id, lat, lng); + else + my.putRiderAvailableMarker(id, lat, lng); + }); + + /* $.each(riders, function(rider_id, rider_data) { // rider location var point = rider_data['loc']; @@ -168,6 +182,7 @@ class DashboardMap { my.putRiderAvailableMarker(rider_id, lat, lng); } }); + */ // console.log(rider_markers); }); diff --git a/public/assets/js/map_mqtt.js b/public/assets/js/map_mqtt.js index 7b6c9331..ebd401bb 100644 --- a/public/assets/js/map_mqtt.js +++ b/public/assets/js/map_mqtt.js @@ -71,7 +71,7 @@ class MapEventHandler { var lat = parseFloat(pl_split[0]); var lng = parseFloat(pl_split[1]); - this.dashmap.putRiderAvaialbleMarker(chan_split[1], lat, lng); + this.dashmap.putRiderAvailableMarker(chan_split[1], lat, lng); break; } } diff --git a/src/Controller/HomeController.php b/src/Controller/HomeController.php index abdeb6fa..ca5654b4 100644 --- a/src/Controller/HomeController.php +++ b/src/Controller/HomeController.php @@ -10,6 +10,7 @@ use Doctrine\ORM\EntityManagerInterface; use App\Service\RiderTracker; use App\Service\GISManagerInterface; use App\Service\JobOrderCache; +use App\Service\RiderCache; use App\Entity\Rider; @@ -38,13 +39,27 @@ class HomeController extends Controller // get active JOs from cache } - public function getRiderLocations(JobOrderCache $jo_cache, EntityManagerInterface $em, RiderTracker $rider_tracker) + public function getRiderLocations(JobOrderCache $jo_cache, RiderCache $rider_cache, EntityManagerInterface $em, RiderTracker $rider_tracker) { - // TODO: get active riders from cache + // get active JOs from cache $active_jos = $jo_cache->getAllActiveJobOrders(); + $riders = $rider_cache->getAllActiveRiders(); - // TODO: get active JOs from cache + // TODO: optimize this + // get all riders and figure out if they have active jos + foreach ($riders as $rider_id => $rider_data) + { + $rider = $em->getRepository(Rider::class)->find($rider_id); + $jo = $rider->getActiveJobOrder(); + if ($jo == null) + $riders[$rider_id]['has_jo'] = false; + else + $riders[$rider_id]['has_jo'] = true; + } + + // get active riders from cache // get all riders + /* $riders = $em->getRepository(Rider::class)->findAll(); $locations = []; @@ -94,10 +109,11 @@ class HomeController extends Controller ]; } + */ return $this->json([ 'jos' => $active_jos, - 'riders' => $locations, + 'riders' => $riders, ]); } diff --git a/src/Controller/RAPIController.php b/src/Controller/RAPIController.php index c5d629c8..ce8631fd 100644 --- a/src/Controller/RAPIController.php +++ b/src/Controller/RAPIController.php @@ -28,6 +28,7 @@ use App\Ramcar\JOEventType; use App\Service\InvoiceGeneratorInterface; use App\Service\MQTTClient; use App\Service\RedisClientProvider; +use App\Service\RiderCache; use App\Entity\RiderSession; use App\Entity\Customer; @@ -209,7 +210,7 @@ class RAPIController extends Controller return $res->getReturnResponse(); } - public function login(Request $req, EncoderFactoryInterface $ef, RedisClientProvider $redis) + public function login(Request $req, EncoderFactoryInterface $ef, RedisClientProvider $redis, RiderCache $rcache) { $required_params = [ 'user', @@ -251,6 +252,11 @@ class RAPIController extends Controller $rider->setAvailable(true); + $rider_id = $rider->getID(); + // cache rider location (default to hub) + // TODO: figure out longitude / latitude default + $rcache->addActiveRider($rider_id, 0, 0); + // TODO: log rider logging in $em->flush(); @@ -289,7 +295,7 @@ class RAPIController extends Controller return $res->getReturnResponse(); } - public function logout(Request $req) + public function logout(Request $req, RiderCache $rcache) { $required_params = []; $em = $this->getDoctrine()->getManager(); @@ -301,6 +307,9 @@ class RAPIController extends Controller $rider = $this->session->getRider(); $rider->setAvailable(false); + // remove from cache + $rcache->removeActiveRider($rider->getID()); + // remove rider from session $this->session->setRider(null); diff --git a/src/Service/JobOrderCache.php b/src/Service/JobOrderCache.php index 32d55e68..488db29d 100644 --- a/src/Service/JobOrderCache.php +++ b/src/Service/JobOrderCache.php @@ -34,7 +34,7 @@ class JobOrderCache $this->active_jo_key, 0, 0, - 22000, + 41000, 'km', ['WITHCOORD' => true] ); diff --git a/src/Service/RiderCache.php b/src/Service/RiderCache.php new file mode 100644 index 00000000..399a63f2 --- /dev/null +++ b/src/Service/RiderCache.php @@ -0,0 +1,78 @@ +redis = $redis_prov->getRedisClient(); + $this->loc_key = $loc_key; + $this->status_key = $status_key; + } + + public function addActiveRider($id, $lat, $lng) + { + $coords = $jo->getCoordinates(); + + $this->redis->geoadd( + $this->loc_key, + $lng, + $lat, + $id + ); + } + + public function getAllActiveRiders() + { + $all_riders = $this->redis->georadius( + $this->loc_key, + 0, + 0, + 41000, + 'km', + ['WITHCOORD' => true] + ); + + $locs = []; + foreach ($all_riders as $data) + { + $id = $data[0]; + $lng = $data[1][0]; + $lat = $data[1][1]; + + $locs[$id] = [ + 'longitude' => $lng, + 'latitude' => $lat, + ]; + } + + // error_log(print_r($all_riders, true)); + return $locs; + } + + public function removeActiveRider($id) + { + $this->redis->zrem( + $this->loc_key, + $id + ); + } + + public function incJobOrderCount($id, $status) + { + $this->redis->hincrby($this->status_key, $id, 1); + } + + public function decJobOrderCount($id, $status) + { + $this->redis->hincrby($this->status_key, $id, -1); + } +}