Add HubSelector service. #543
This commit is contained in:
parent
09d04a8a7e
commit
4efef6d397
3 changed files with 129 additions and 0 deletions
|
|
@ -266,3 +266,7 @@ services:
|
||||||
event: 'postPersist'
|
event: 'postPersist'
|
||||||
entity: 'App\Entity\CustomerVehicle'
|
entity: 'App\Entity\CustomerVehicle'
|
||||||
|
|
||||||
|
# hub service
|
||||||
|
App\Service\HubSelector:
|
||||||
|
arguments:
|
||||||
|
$em: "@doctrine.orm.entity_manager"
|
||||||
|
|
|
||||||
|
|
@ -1011,12 +1011,14 @@ class APIController extends Controller implements LoggedController
|
||||||
if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) ||
|
if (($jo->getServiceType() == ServiceType::BATTERY_REPLACEMENT_NEW) ||
|
||||||
($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
|
($jo->getServicetype() == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
|
||||||
{
|
{
|
||||||
|
// TODO: call HubSelector service here
|
||||||
// get nearest hub
|
// get nearest hub
|
||||||
// $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im);
|
// $nearest_hub = $this->findNearestHubWithInventory($jo, $batt, $em, $map_tools, $im);
|
||||||
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
|
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
// TODO: call HubSelector service here
|
||||||
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
|
$nearest_hub = $this->findNearestHub($jo, $em, $map_tools);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
123
src/Service/HubSelector.php
Normal file
123
src/Service/HubSelector.php
Normal file
|
|
@ -0,0 +1,123 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Service;
|
||||||
|
|
||||||
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
|
use CrEOF\Spatial\PHP\Types\Geometry\Point;
|
||||||
|
|
||||||
|
use App\Entity\Hub;
|
||||||
|
|
||||||
|
use App\Ramcar\HubCriteria;
|
||||||
|
use App\Ramcar\ServiceType;
|
||||||
|
|
||||||
|
class HubSelector
|
||||||
|
{
|
||||||
|
protected $em;
|
||||||
|
|
||||||
|
public function __construct(EntityManagerInterface $em)
|
||||||
|
{
|
||||||
|
$this->em = $em;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function find(HubCriteria $criteria)
|
||||||
|
{
|
||||||
|
$point = $criteria->getPoint();
|
||||||
|
$limit_results = $criteria->getLimitResults();
|
||||||
|
$limit_distance = $criteria->getLimitDistance();
|
||||||
|
$jo_type = $criteria->getJoType();
|
||||||
|
$has_inventory = $criteria->hasInventory();
|
||||||
|
$items = $criteria->getItems();
|
||||||
|
$day_time = $criteria->getDayTime();
|
||||||
|
|
||||||
|
// check for jo type
|
||||||
|
if (($jo_type == ServiceType::BATTERY_REPLACEMENT_NEW)) ||
|
||||||
|
($jo_type == ServiceType::BATTERY_REPLACEMENT_WARRANTY))
|
||||||
|
{
|
||||||
|
// check if we need to get inventory
|
||||||
|
if ($has_inventory)
|
||||||
|
{
|
||||||
|
if ($day_time != null)
|
||||||
|
{
|
||||||
|
// call function for jo type, inventory == true, and check for day and time
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// call function for jo type and inventory == true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ($day_time != null)
|
||||||
|
{
|
||||||
|
// call function for jo type and check for day and time
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// call function for jo type only
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: this needs to go to a function.. somewhere
|
||||||
|
// get closest hubs based on st_distance function from db
|
||||||
|
$query_string = 'SELECT h, st_distance(h.coordinates, point(:lng, :lat)) as dist FROM App\Entity\Hub h WHERE h.status_open = true';
|
||||||
|
|
||||||
|
$query_string .= ' ORDER BY dist';
|
||||||
|
|
||||||
|
$query = $this->em->createQuery($query_string)
|
||||||
|
->setParameter('lat', $point->getLatitude())
|
||||||
|
->setParameter('lng', $point->getLongitude());
|
||||||
|
|
||||||
|
$query->setMaxResults($limit);
|
||||||
|
|
||||||
|
// error_log($query->getSql());
|
||||||
|
$result = $query->getResult();
|
||||||
|
|
||||||
|
$hubs = [];
|
||||||
|
$final_data = [];
|
||||||
|
foreach ($result as $row)
|
||||||
|
{
|
||||||
|
$hubs[] = $row[0];
|
||||||
|
|
||||||
|
// get coordinates of hub
|
||||||
|
$hub_coordinates = $row[0]->getCoordinates();
|
||||||
|
|
||||||
|
$cust_lat = $point->getLatitude();
|
||||||
|
$cust_lng = $point->getLongitude();
|
||||||
|
|
||||||
|
$hub_lat = $hub_coordinates->getLatitude();
|
||||||
|
$hub_lng = $hub_coordinates->getLongitude();
|
||||||
|
|
||||||
|
// get distance in kilometers from customer point to hub point
|
||||||
|
$dist = $this->distance($cust_lat, $cust_lng, $hub_lat, $hub_lng);
|
||||||
|
|
||||||
|
if ($dist < $limit_distance)
|
||||||
|
{
|
||||||
|
$final_data[] = [
|
||||||
|
'hub' => $row[0],
|
||||||
|
'db_distance' => $row['dist'],
|
||||||
|
'distance' => $dist,
|
||||||
|
'duration' => 0,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $final_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert db distance to kilometers
|
||||||
|
protected function distance($lat1, $lon1, $lat2, $lon2)
|
||||||
|
{
|
||||||
|
if (($lat1 == $lat2) && ($lon1 == $lon2))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
$theta = $lon1 - $lon2;
|
||||||
|
$dist = sin(deg2rad($lat1)) * sin(deg2rad($lat2)) + cos(deg2rad($lat1)) * cos(deg2rad($lat2)) * cos(deg2rad($theta));
|
||||||
|
$dist = acos($dist);
|
||||||
|
$dist = rad2deg($dist);
|
||||||
|
$miles = $dist * 60 * 1.1515;
|
||||||
|
|
||||||
|
return round(($miles * 1.609344), 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue