Have graphs for all hubs in list #409
This commit is contained in:
parent
d63dfcabbd
commit
760f823794
2 changed files with 74 additions and 48 deletions
|
|
@ -28,37 +28,32 @@ class AnalyticsController extends Controller
|
||||||
*/
|
*/
|
||||||
public function forecast(EntityManagerInterface $em)
|
public function forecast(EntityManagerInterface $em)
|
||||||
{
|
{
|
||||||
|
$hub_list = [ 6, 4, 36, 7, 8, 126, 127, 18, 12, 9, 60, 10, 21, 135 ];
|
||||||
|
|
||||||
|
$hub_data = [];
|
||||||
|
foreach ($hub_list as $hub_id)
|
||||||
|
{
|
||||||
|
$hub_data[$hub_id] = $this->generateHubData($em, $hub_id, 5000, new DateTime());
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'hub_list' => $hub_data,
|
||||||
|
];
|
||||||
|
|
||||||
|
return $this->render('analytics/forecast.html.twig', $params);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateHubData($em, $hub_id, $distance_limit, DateTime $today)
|
||||||
|
{
|
||||||
$date_start = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-01 00:00:00');
|
$date_start = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-01 00:00:00');
|
||||||
$date_end = DateTime::createFromFormat('Y-m-d H:i:s', '2020-04-31 23:59:59');
|
$date_end = new DateTime();
|
||||||
|
|
||||||
// get hub to analyze
|
// get hub to analyze
|
||||||
$hub = $em->getRepository(Hub::class)->find(86);
|
$hub = $em->getRepository(Hub::class)->find($hub_id);
|
||||||
$hub_coord = $hub->getCoordinates();
|
|
||||||
|
|
||||||
// distance limit in meters
|
|
||||||
$distance = 5000;
|
|
||||||
|
|
||||||
$conn = $em->getConnection();
|
$conn = $em->getConnection();
|
||||||
|
|
||||||
// create query
|
// get job order data
|
||||||
// formula to convert to km is 111195 * st_distance
|
$jos = $this->generateJobOrderData($conn, $hub, $distance_limit);
|
||||||
$sql = "select id, round(st_distance(coordinates, Point(:lng, :lat)) * 111195) as dist, date_schedule from job_order where st_distance(coordinates, Point(:lng, :lat)) * 111195 <= :distance_limit and date_schedule >= :date_start and date_schedule <= :date_end and status <> 'cancelled' order by date_schedule asc";
|
|
||||||
// $query = $em->createQuery('select jo from App\\Entity\\JobOrder jo where st_distance(jo.coordinates, point(:lng, :lat)) * 111195 <= :distance_limit and jo.date_schedule >= :date_start and jo.date_schedule <= :date_end');
|
|
||||||
$stmt = $conn->prepare($sql);
|
|
||||||
$stmt->bindValue('lng', $hub_coord->getLongitude());
|
|
||||||
$stmt->bindValue('lat', $hub_coord->getLatitude());
|
|
||||||
$stmt->bindValue('distance_limit', $distance);
|
|
||||||
$stmt->bindValue('date_start', $date_start->format('Y-m-d H:i:s'));
|
|
||||||
$stmt->bindValue('date_end', $date_end->format('Y-m-d H:i:s'));
|
|
||||||
$stmt->execute();
|
|
||||||
$jos = $stmt->fetchAll();
|
|
||||||
|
|
||||||
error_log(count($jos));
|
|
||||||
|
|
||||||
// get 'today'
|
|
||||||
$today = new DateTime();
|
|
||||||
$today = DateTime::createFromFormat('Ymd', '20201101');
|
|
||||||
|
|
||||||
// initialize counters
|
// initialize counters
|
||||||
$c_weekday = [];
|
$c_weekday = [];
|
||||||
|
|
@ -85,8 +80,46 @@ class AnalyticsController extends Controller
|
||||||
$c_weekday[$year][$month][$weekday][$hour]++;
|
$c_weekday[$year][$month][$weekday][$hour]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_log(print_r($c_weekday, true));
|
// error_log(print_r($c_weekday, true));
|
||||||
|
|
||||||
|
$chart_year = $this->generateYearData($date_start, $date_end, $c_day);
|
||||||
|
$chart_weekday = $this->generateWeekdayData($c_weekday, $today);
|
||||||
|
|
||||||
|
// error_log(print_r($chart_weekday, true));
|
||||||
|
|
||||||
|
$params = [
|
||||||
|
'id' => $hub->getID(),
|
||||||
|
'label' => $hub->getName(),
|
||||||
|
'data_year' => $chart_year,
|
||||||
|
'data_weekday' => $chart_weekday,
|
||||||
|
];
|
||||||
|
|
||||||
|
return $params;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateJobOrderData($conn, $hub, $distance_limit)
|
||||||
|
{
|
||||||
|
$hub_coord = $hub->getCoordinates();
|
||||||
|
|
||||||
|
// create query
|
||||||
|
// formula to convert to km is 111195 * st_distance
|
||||||
|
$sql = "select id, round(st_distance(coordinates, Point(:lng, :lat)) * 111195) as dist, date_schedule from job_order where st_distance(coordinates, Point(:lng, :lat)) * 111195 <= :distance_limit and status <> 'cancelled' order by date_schedule asc";
|
||||||
|
$stmt = $conn->prepare($sql);
|
||||||
|
$stmt->bindValue('lng', $hub_coord->getLongitude());
|
||||||
|
$stmt->bindValue('lat', $hub_coord->getLatitude());
|
||||||
|
$stmt->bindValue('distance_limit', $distance_limit);
|
||||||
|
// $stmt->bindValue('date_start', $date_start->format('Y-m-d H:i:s'));
|
||||||
|
// $stmt->bindValue('date_end', $date_end->format('Y-m-d H:i:s'));
|
||||||
|
$stmt->execute();
|
||||||
|
$jos = $stmt->fetchAll();
|
||||||
|
|
||||||
|
error_log(count($jos));
|
||||||
|
|
||||||
|
return $jos;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function generateYearData($date_start, $date_end, $c_day)
|
||||||
|
{
|
||||||
$res_year = [];
|
$res_year = [];
|
||||||
$date_loop = clone $date_start;
|
$date_loop = clone $date_start;
|
||||||
for (; $date_loop <= $date_end; $date_loop->add(new DateInterval('P1D')))
|
for (; $date_loop <= $date_end; $date_loop->add(new DateInterval('P1D')))
|
||||||
|
|
@ -98,6 +131,7 @@ class AnalyticsController extends Controller
|
||||||
$id = $date_loop->format('m-d');
|
$id = $date_loop->format('m-d');
|
||||||
|
|
||||||
// NOTE: toss aside feb 29
|
// NOTE: toss aside feb 29
|
||||||
|
// TODO: handle april 29
|
||||||
if ($id == '02-29')
|
if ($id == '02-29')
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
|
@ -117,20 +151,7 @@ class AnalyticsController extends Controller
|
||||||
foreach ($res_year as $day => $day_data)
|
foreach ($res_year as $day => $day_data)
|
||||||
$chart_year[] = $day_data;
|
$chart_year[] = $day_data;
|
||||||
|
|
||||||
// error_log(print_r($chart_year, true));
|
return $chart_year;
|
||||||
|
|
||||||
// error_log(print_r($c_day, true));
|
|
||||||
|
|
||||||
$chart_weekday = $this->generateWeekdayData($c_weekday, $today);
|
|
||||||
|
|
||||||
error_log(print_r($chart_weekday, true));
|
|
||||||
|
|
||||||
$params = [
|
|
||||||
'data_year' => $chart_year,
|
|
||||||
'data_weekday' => $chart_weekday,
|
|
||||||
];
|
|
||||||
|
|
||||||
return $this->render('analytics/forecast.html.twig', $params);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function generateWeekdayData($all_weekday_data, $today)
|
protected function generateWeekdayData($all_weekday_data, $today)
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,7 @@
|
||||||
<!-- END: Subheader -->
|
<!-- END: Subheader -->
|
||||||
<div class="m-content">
|
<div class="m-content">
|
||||||
<!--Begin::Section-->
|
<!--Begin::Section-->
|
||||||
|
{% for hub in hub_list %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-xl-12">
|
<div class="col-xl-12">
|
||||||
<div class="m-portlet m-portlet--mobile">
|
<div class="m-portlet m-portlet--mobile">
|
||||||
|
|
@ -19,20 +20,21 @@
|
||||||
<div class="m-portlet__head-caption">
|
<div class="m-portlet__head-caption">
|
||||||
<div class="m-portlet__head-title col-xl-12">
|
<div class="m-portlet__head-title col-xl-12">
|
||||||
<h3 class="m-portlet__head-text col-xl-4">
|
<h3 class="m-portlet__head-text col-xl-4">
|
||||||
Forecasting
|
{{ hub.label }}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="year-day-chart" style="height: 400px;">
|
<div id="year-day-chart-{{ hub.id }}" style="height: 400px;">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="month-weekday-chart" style="height: 400px;">
|
<div id="month-weekday-chart-{{ hub.id }}" style="height: 400px;">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|
@ -42,11 +44,12 @@
|
||||||
<script src="//www.amcharts.com/lib/4/maps.js"></script>
|
<script src="//www.amcharts.com/lib/4/maps.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
{% for hub in hub_list %}
|
||||||
// create chart instance
|
// create chart instance
|
||||||
var chart = am4core.create("year-day-chart", am4charts.XYChart);
|
var chart = am4core.create("year-day-chart-{{ hub.id }}", am4charts.XYChart);
|
||||||
|
|
||||||
// add data
|
// add data
|
||||||
chart.data = {{ data_year|json_encode|raw }};
|
chart.data = {{ hub.data_year|json_encode|raw }};
|
||||||
|
|
||||||
// create axes
|
// create axes
|
||||||
var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
|
var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
|
||||||
|
|
@ -81,8 +84,8 @@ s2020.dataFields.categoryX = "date";
|
||||||
|
|
||||||
//------------------------------------------------------------------------
|
//------------------------------------------------------------------------
|
||||||
|
|
||||||
var chart2 = am4core.create("month-weekday-chart", am4charts.XYChart);
|
var chart2 = am4core.create("month-weekday-chart-{{ hub.id }}", am4charts.XYChart);
|
||||||
chart2.data = {{ data_weekday|json_encode|raw }};
|
chart2.data = {{ hub.data_weekday|json_encode|raw }};
|
||||||
|
|
||||||
var xAxis = chart2.xAxes.push(new am4charts.CategoryAxis());
|
var xAxis = chart2.xAxes.push(new am4charts.CategoryAxis());
|
||||||
xAxis.dataFields.category = "hour";
|
xAxis.dataFields.category = "hour";
|
||||||
|
|
@ -104,5 +107,7 @@ l2019.strokeWidth = 3;
|
||||||
l2019.dataFields.valueY = "y2019";
|
l2019.dataFields.valueY = "y2019";
|
||||||
l2019.dataFields.categoryX = "hour";
|
l2019.dataFields.categoryX = "hour";
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue