Have active job orders loaded from cache in dashboard map #299
This commit is contained in:
parent
9e00c3f115
commit
cba80ddd90
6 changed files with 103 additions and 25 deletions
|
|
@ -204,10 +204,9 @@ services:
|
||||||
App\Service\GISManagerInterface: "@App\\Service\\GISManager\\OpenStreet"
|
App\Service\GISManagerInterface: "@App\\Service\\GISManager\\OpenStreet"
|
||||||
#App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Google"
|
#App\Service\GISManagerInterface: "@App\\Service\\GISManager\\Google"
|
||||||
|
|
||||||
App\EventListener\JobOrderActiveCache:
|
App\EventListener\JobOrderActiveCacheListener:
|
||||||
arguments:
|
arguments:
|
||||||
$redis: "@App\\Service\\RedisClientProvider"
|
$jo_cache: "@App\\Service\\JobOrderCache"
|
||||||
$key: "%env(JO_ACTIVE_CACHE_KEY)%"
|
|
||||||
$mqtt: "@App\\Service\\MQTTClient"
|
$mqtt: "@App\\Service\\MQTTClient"
|
||||||
tags:
|
tags:
|
||||||
- name: 'doctrine.orm.entity_listener'
|
- name: 'doctrine.orm.entity_listener'
|
||||||
|
|
@ -219,3 +218,8 @@ services:
|
||||||
- name: 'doctrine.orm.entity_listener'
|
- name: 'doctrine.orm.entity_listener'
|
||||||
event: 'postPersist'
|
event: 'postPersist'
|
||||||
entity: 'App\Entity\JobOrder'
|
entity: 'App\Entity\JobOrder'
|
||||||
|
|
||||||
|
App\Service\JobOrderCache:
|
||||||
|
arguments:
|
||||||
|
$redis_prov: "@App\\Service\\RedisClientProvider"
|
||||||
|
$active_jo_key: "%env(JO_ACTIVE_CACHE_KEY)%"
|
||||||
|
|
|
||||||
|
|
@ -124,6 +124,14 @@ class DashboardMap {
|
||||||
my.layer_groups.customer.clearLayers();
|
my.layer_groups.customer.clearLayers();
|
||||||
// get riders and mark
|
// get riders and mark
|
||||||
var riders = response.riders;
|
var riders = response.riders;
|
||||||
|
var jos = response.jos;
|
||||||
|
|
||||||
|
$.each(jos, function(id, data) {
|
||||||
|
var lat = data.latitude;
|
||||||
|
var lng = data.longitude;
|
||||||
|
|
||||||
|
my.putCustomerMarker(id, lat, lng);
|
||||||
|
});
|
||||||
|
|
||||||
$.each(riders, function(rider_id, rider_data) {
|
$.each(riders, function(rider_id, rider_data) {
|
||||||
// rider location
|
// rider location
|
||||||
|
|
@ -140,7 +148,7 @@ class DashboardMap {
|
||||||
if (rider_data['has_jo']) {
|
if (rider_data['has_jo']) {
|
||||||
var jo_data = rider_data['jo'];
|
var jo_data = rider_data['jo'];
|
||||||
|
|
||||||
my.putCustomerMarker(jo_data['id'], clat, clng);
|
// my.putCustomerMarker(jo_data['id'], clat, clng);
|
||||||
my.putRiderActiveJOMarker(rider_id, lat, lng);
|
my.putRiderActiveJOMarker(rider_id, lat, lng);
|
||||||
} else {
|
} else {
|
||||||
my.putRiderAvailableMarker(rider_id, lat, lng);
|
my.putRiderAvailableMarker(rider_id, lat, lng);
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,7 @@ use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
use App\Service\RiderTracker;
|
use App\Service\RiderTracker;
|
||||||
use App\Service\GISManagerInterface;
|
use App\Service\GISManagerInterface;
|
||||||
|
use App\Service\JobOrderCache;
|
||||||
|
|
||||||
use App\Entity\Rider;
|
use App\Entity\Rider;
|
||||||
|
|
||||||
|
|
@ -18,8 +19,11 @@ class HomeController extends Controller
|
||||||
/**
|
/**
|
||||||
* @Menu(selected="home")
|
* @Menu(selected="home")
|
||||||
*/
|
*/
|
||||||
public function index(EntityManagerInterface $em, RiderTracker $rider_tracker,
|
public function index(
|
||||||
GISManagerInterface $gis_manager)
|
EntityManagerInterface $em,
|
||||||
|
RiderTracker $rider_tracker,
|
||||||
|
GISManagerInterface $gis_manager
|
||||||
|
)
|
||||||
{
|
{
|
||||||
// get map
|
// get map
|
||||||
$params['map_js_file'] = $gis_manager->getJSInitFile();
|
$params['map_js_file'] = $gis_manager->getJSInitFile();
|
||||||
|
|
@ -27,9 +31,18 @@ class HomeController extends Controller
|
||||||
return $this->render('home.html.twig', $params);
|
return $this->render('home.html.twig', $params);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getRiderLocations(EntityManagerInterface $em, RiderTracker $rider_tracker)
|
public function getMapLocations(JobOrderCache $jo_cache)
|
||||||
|
{
|
||||||
|
$active_jos = $jo_cache->getAllActiveJobOrders();
|
||||||
|
|
||||||
|
// get active JOs from cache
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRiderLocations(JobOrderCache $jo_cache, EntityManagerInterface $em, RiderTracker $rider_tracker)
|
||||||
{
|
{
|
||||||
// TODO: get active riders from cache
|
// TODO: get active riders from cache
|
||||||
|
$active_jos = $jo_cache->getAllActiveJobOrders();
|
||||||
|
|
||||||
// TODO: get active JOs from cache
|
// TODO: get active JOs from cache
|
||||||
// get all riders
|
// get all riders
|
||||||
$riders = $em->getRepository(Rider::class)->findAll();
|
$riders = $em->getRepository(Rider::class)->findAll();
|
||||||
|
|
@ -83,6 +96,7 @@ class HomeController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->json([
|
return $this->json([
|
||||||
|
'jos' => $active_jos,
|
||||||
'riders' => $locations,
|
'riders' => $locations,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4,22 +4,18 @@ namespace App\EventListener;
|
||||||
|
|
||||||
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
|
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
|
||||||
|
|
||||||
use App\Service\RedisClientProvider;
|
use App\Service\JobOrderCache;
|
||||||
|
|
||||||
use App\Ramcar\JOStatus;
|
use App\Ramcar\JOStatus;
|
||||||
|
|
||||||
use App\Entity\JobOrder;
|
use App\Entity\JobOrder;
|
||||||
|
|
||||||
class JobOrderActiveCache
|
class JobOrderActiveCacheListener
|
||||||
{
|
{
|
||||||
protected $redis;
|
|
||||||
protected $key;
|
protected $key;
|
||||||
protected $mqtt;
|
protected $mqtt;
|
||||||
|
|
||||||
public function __construct(RedisClientProvider $redis, $key, $mqtt)
|
public function __construct(JobOrderCache $jo_cache, $mqtt)
|
||||||
{
|
{
|
||||||
$this->redis = $redis->getRedisClient();
|
$this->jo_cache = $jo_cache;
|
||||||
$this->key = $key;
|
|
||||||
$this->mqtt = $mqtt;
|
$this->mqtt = $mqtt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -76,18 +72,11 @@ class JobOrderActiveCache
|
||||||
|
|
||||||
protected function processActiveJO($jo)
|
protected function processActiveJO($jo)
|
||||||
{
|
{
|
||||||
$coords = $jo->getCoordinates();
|
// save in cache
|
||||||
|
$jo_cache->addActiveJobOrder($jo);
|
||||||
// put in redis cache
|
|
||||||
error_log('add ' . $this->key . ' - (' . $coords->getLongitude() . ', ' . $coords->getLatitude() . ') - ' . $jo->getID());
|
|
||||||
$this->redis->geoadd(
|
|
||||||
$this->key,
|
|
||||||
$coords->getLongitude(),
|
|
||||||
$coords->getLatitude(),
|
|
||||||
$jo->getID()
|
|
||||||
);
|
|
||||||
|
|
||||||
// publish to mqtt
|
// publish to mqtt
|
||||||
|
// TODO: do we put the key in config?
|
||||||
$this->mqtt->publish(
|
$this->mqtt->publish(
|
||||||
'jo/' . $jo->getID() . '/location',
|
'jo/' . $jo->getID() . '/location',
|
||||||
$coords->getLatitude() . ':' . $coords->getLongitude()
|
$coords->getLatitude() . ':' . $coords->getLongitude()
|
||||||
58
src/Service/JobOrderCache.php
Normal file
58
src/Service/JobOrderCache.php
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Service;
|
||||||
|
|
||||||
|
use App\Service\RedisClientProvider;
|
||||||
|
use App\Entity\JobOrder;
|
||||||
|
|
||||||
|
class JobOrderCache
|
||||||
|
{
|
||||||
|
protected $redis;
|
||||||
|
protected $active_jo_key;
|
||||||
|
|
||||||
|
public function __construct(RedisClientProvider $redis_prov, $active_jo_key)
|
||||||
|
{
|
||||||
|
$this->redis = $redis_prov->getRedisClient();
|
||||||
|
$this->active_jo_key = $active_jo_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function addActiveJobOrder(JobOrder $jo)
|
||||||
|
{
|
||||||
|
$coords = $jo->getCoordinates();
|
||||||
|
|
||||||
|
$this->redis->geoadd(
|
||||||
|
$this->active_jo_key,
|
||||||
|
$coords->getLongitude(),
|
||||||
|
$coords->getLatitude(),
|
||||||
|
$jo->getID()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAllActiveJobOrders()
|
||||||
|
{
|
||||||
|
$all_jo = $this->redis->georadius(
|
||||||
|
$this->active_jo_key,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
22000,
|
||||||
|
'km',
|
||||||
|
['WITHCOORD' => true]
|
||||||
|
);
|
||||||
|
|
||||||
|
$jo_locs = [];
|
||||||
|
foreach ($all_jo as $jo_data)
|
||||||
|
{
|
||||||
|
$id = $jo_data[0];
|
||||||
|
$lng = $jo_data[1][0];
|
||||||
|
$lat = $jo_data[1][1];
|
||||||
|
|
||||||
|
$jo_locs[$id] = [
|
||||||
|
'longitude' => $lng,
|
||||||
|
'latitude' => $lat,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
// error_log(print_r($all_jo, true));
|
||||||
|
return $jo_locs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -18,12 +18,17 @@ class RedisClientProvider
|
||||||
$this->host = $host;
|
$this->host = $host;
|
||||||
$this->port = $port;
|
$this->port = $port;
|
||||||
$this->password = $password;
|
$this->password = $password;
|
||||||
|
$this->redis = null;
|
||||||
|
|
||||||
$this->connect();
|
$this->connect();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function connect()
|
protected function connect()
|
||||||
{
|
{
|
||||||
|
// already connected
|
||||||
|
if ($this->redis != null)
|
||||||
|
return $this->redis;
|
||||||
|
|
||||||
// if password is specified attempt connection
|
// if password is specified attempt connection
|
||||||
if (strlen($this->password) > 0)
|
if (strlen($this->password) > 0)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue