From 2803c264ac98c09f1cc2046000ae63c08f78a2d3 Mon Sep 17 00:00:00 2001 From: Kendrick Chan Date: Thu, 25 Jun 2020 23:39:46 +0800 Subject: [PATCH] Allow analytics to be filtered by date range #409 --- src/Controller/AnalyticsController.php | 146 +++++++++--------- templates/analytics/forecast_form.html.twig | 30 ++-- templates/analytics/forecast_submit.html.twig | 14 +- 3 files changed, 104 insertions(+), 86 deletions(-) diff --git a/src/Controller/AnalyticsController.php b/src/Controller/AnalyticsController.php index 017333e5..a14c0581 100644 --- a/src/Controller/AnalyticsController.php +++ b/src/Controller/AnalyticsController.php @@ -102,10 +102,14 @@ class AnalyticsController extends Controller */ public function forecastSubmit(EntityManagerInterface $em, Request $req) { + $today = new DateTime(); + $hub_list = $req->request->get('hub_ids', []); $distances = $req->request->get('distances', []); - $today = DateTime::createFromFormat('d M Y', $req->request->get('date')); - $month = $today->format('m'); + + $date_from = DateTime::createFromFormat('d M Y', $req->request->get('date_from')); + $date_to = DateTime::createFromFormat('d M Y', $req->request->get('date_to')); + // error_log(print_r($hub_list, true)); // $hub_list = [ 6, 4, 36, 7, 8, 126, 127, 18, 12, 9, 60, 10, 21, 135 ]; @@ -119,7 +123,7 @@ class AnalyticsController extends Controller $hub = $em->getRepository(Hub::class)->find($hub_id); $coords = $hub->getCoordinates(); - $hub_data[$hub_id] = $this->generateHubData($em, $hub, $dist, $today, $overlaps); + $hub_data[$hub_id] = $this->generateHubData($em, $hub, $dist, $date_from, $date_to, $overlaps); $hub_coverage[] = [ 'longitude' => $coords->getLongitude(), @@ -143,8 +147,9 @@ class AnalyticsController extends Controller foreach ($hub_data as $hub_id => $one_hub) { $c_weekday = $one_hub['c_weekday']; + $chart_weekday = $this->generateWeekdayData($c_weekday, $today, $overlaps); - $chart_all_weekdays = $this->generateAllWeekData($c_weekday, $today, $overlaps); + $chart_all_weekdays = $this->generateAllWeekData($c_weekday, $overlaps); // figure out the rider schedules based on the max hour values $scheduler_data = $chart_all_weekdays['scheduler_data']; @@ -153,18 +158,16 @@ class AnalyticsController extends Controller $total_jos = 0; - // run scheduler - // check if 2018 data is available - if (isset($scheduler_data['2018'][$month])) - { - // send 2018 + month data - $sched_res = $this->runScheduler($scheduler_data['2018'][$month]); + // error_log(print_r($scheduler_data, true)); - // tally total JOs for the month - foreach ($scheduler_data['2018'][$month] as $sday_data) - foreach ($sday_data as $shour_data) - $total_jos += $shour_data; - } + // run scheduler + $sched_res = $this->runScheduler($scheduler_data); + + // tally total JOs for the month + foreach ($scheduler_data as $sday_data) + foreach ($sday_data as $shour_data) + $total_jos += $shour_data; + /* else { $sched_res = [ @@ -172,6 +175,10 @@ class AnalyticsController extends Controller 'total_riders' => 0, ]; } + */ + + + // error_log(print_r($chart_all_weekdays, true)); // agggregate weekday data $i = 0; @@ -244,7 +251,7 @@ class AnalyticsController extends Controller // error_log(print_r($args, true)); - // error_log('running...' . $sched_script); + error_log('running...' . $sched_script); $proc = new Process($args); $proc->run(); @@ -253,7 +260,7 @@ class AnalyticsController extends Controller error_log('SCHEDULER DID NOT RUN PROPERLY'); $res = $proc->getOutput(); - // error_log($res); + error_log($res); // segregate into weekdays @@ -321,17 +328,14 @@ class AnalyticsController extends Controller return $data; } - protected function generateHubData($em, $hub, $distance_limit, DateTime $today, &$overlaps) + protected function generateHubData($em, $hub, $distance_limit, DateTime $date_start, DateTime $date_end, &$overlaps) { - $date_start = DateTime::createFromFormat('Y-m-d H:i:s', '2018-01-01 00:00:00'); - $date_end = new DateTime(); - // get hub to analyze // $hub = $em->getRepository(Hub::class)->find($hub_id); $conn = $em->getConnection(); // get job order data (job orders within coverage area) - $jos = $this->generateJobOrderData($conn, $hub, $distance_limit); + $jos = $this->generateJobOrderData($conn, $hub, $distance_limit, $date_start, $date_end); // initialize counters $c_weekday = []; @@ -360,21 +364,22 @@ class AnalyticsController extends Controller $c_day[$year][$month][$day]++; // weekday - if (!isset($c_weekday[$year][$month][$weekday][$hour])) + if (!isset($c_weekday[$weekday][$hour])) { - $c_weekday[$year][$month][$weekday][$hour]['total'] = 0; - $c_weekday[$year][$month][$weekday][$hour]['count'] = 0; - $c_weekday[$year][$month][$weekday][$hour]['jos'] = []; + $c_weekday[$weekday][$hour]['total'] = 0; + $c_weekday[$weekday][$hour]['count'] = 0; + $c_weekday[$weekday][$hour]['jos'] = []; } - $c_weekday[$year][$month][$weekday][$hour]['total']++; - $c_weekday[$year][$month][$weekday][$hour]['jos'][$jo_id] = $jo_id; + $c_weekday[$weekday][$hour]['total']++; + $c_weekday[$weekday][$hour]['jos'][$jo_id] = $jo_id; - if (!isset($c_week_count[$year][$month][$week][$weekday][$hour])) + // make a count of number of weeks, so we can take average + if (!isset($c_week_count[$week][$weekday][$hour])) { // error_log('week detected - ' . $week); - $c_week_count[$year][$month][$week][$weekday][$hour] = 1; - $c_weekday[$year][$month][$weekday][$hour]['count']++; + $c_week_count[$week][$weekday][$hour] = 1; + $c_weekday[$weekday][$hour]['count']++; } // track overlaps (jo that can be handled by more than one hub) @@ -404,19 +409,19 @@ class AnalyticsController extends Controller return $params; } - protected function generateJobOrderData($conn, $hub, $distance_limit) + protected function generateJobOrderData($conn, $hub, $distance_limit, DateTime $date_start, DateTime $date_end) { $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"; + $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' and date_schedule >= :date_start and date_schedule <= :date_end 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->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(); @@ -461,7 +466,7 @@ class AnalyticsController extends Controller return $chart_year; } - protected function generateAllWeekData($all_weekday_data, $today, $overlaps) + protected function generateAllWeekData($all_weekday_data, $overlaps) { $data = []; @@ -470,53 +475,56 @@ class AnalyticsController extends Controller for ($i = 0; $i < 24; $i++) $hours[] = sprintf('%02d', $i); - $month = $today->format('m'); - $year_data = []; + // TODO: substitute this + $year_data = $all_weekday_data; $scheduler_data = []; + /* + error_log('----------------------------------------------------------------------'); + error_log(print_r($all_weekday_data, true)); + error_log('----------------------------------------------------------------------'); + */ + // gather maximum for each hour foreach ($this->weekdays as $weekday) { - foreach ($all_weekday_data as $year => $year_data) + // go through the hours + foreach ($hours as $hour) { - // go through the hours - foreach ($hours as $hour) + $id = $hour + 0; + if (!isset($data[$id])) + $data[$id] = [ + 'hour' => $hour, + ]; + + // get hour data + $prefix = $weekday; + if (isset($year_data[$weekday][$hour])) { - $id = $hour + 0; - if (!isset($data[$id])) - $data[$id] = [ - 'hour' => $hour, - ]; + // calculate the rider value for each JO and use that score as basis + $total_rv = $this->calculateTotalRiderValue($year_data[$weekday][$hour]['jos'], $overlaps); + $rv_average = ceil($total_rv / $year_data[$weekday][$hour]['count']); - // get hour data - $year_id = 'y' . $year; - $prefix = $year_id . '_' . $weekday; - if (isset($year_data[$month][$weekday][$hour])) + $data[$id][$prefix] = $year_data[$weekday][$hour]['total']; + $data[$id][$prefix . '_count'] = $year_data[$weekday][$hour]['count']; + $data[$id][$prefix . '_average'] = ceil($year_data[$weekday][$hour]['total'] / $year_data[$weekday][$hour]['count']); + $data[$id][$prefix . '_rv_average'] = $rv_average; + + // assign scheduler data + $scheduler_data[$weekday][$hour] = $rv_average; + } + else + { + if (!isset($scheduler_data[$weekday][$hour])) { - // calculate the rider value for each JO and use that score as basis - $total_rv = $this->calculateTotalRiderValue($year_data[$month][$weekday][$hour]['jos'], $overlaps); - $rv_average = ceil($total_rv / $year_data[$month][$weekday][$hour]['count']); - - $data[$id][$prefix] = $year_data[$month][$weekday][$hour]['total']; - $data[$id][$prefix . '_count'] = $year_data[$month][$weekday][$hour]['count']; - $data[$id][$prefix . '_average'] = ceil($year_data[$month][$weekday][$hour]['total'] / $year_data[$month][$weekday][$hour]['count']); - $data[$id][$prefix . '_rv_average'] = $rv_average; - - // assign scheduler data - $scheduler_data[$year][$month][$weekday][$hour] = $rv_average; - } - else - { - if (!isset($scheduler_data[$year][$month][$weekday][$hour])) - { - $data[$id][$prefix . '_rv_average'] = 0; - $scheduler_data[$year][$month][$weekday][$hour] = 0; - } + $data[$id][$prefix . '_rv_average'] = 0; + $scheduler_data[$weekday][$hour] = 0; } } } } + $data['scheduler_data'] = $scheduler_data; // error_log(print_r($data, true)); diff --git a/templates/analytics/forecast_form.html.twig b/templates/analytics/forecast_form.html.twig index 5dd51e7f..4940d311 100644 --- a/templates/analytics/forecast_form.html.twig +++ b/templates/analytics/forecast_form.html.twig @@ -31,16 +31,26 @@
-
- -
- - - - -
- -
+
+ +
+ + + + +
+ +
+
+ +
+ + + + +
+ +
{% for hub_id in default_hubs %} diff --git a/templates/analytics/forecast_submit.html.twig b/templates/analytics/forecast_submit.html.twig index d884bc15..2263694b 100644 --- a/templates/analytics/forecast_submit.html.twig +++ b/templates/analytics/forecast_submit.html.twig @@ -330,49 +330,49 @@ var lmon = chart2.series.push(new am4charts.LineSeries()); lmon.name = "Monday"; lmon.stroke = am4core.color("#003f5c"); lmon.strokeWidth = 2; -lmon.dataFields.valueY = "y2018_Monday_rv_average"; +lmon.dataFields.valueY = "Monday_rv_average"; lmon.dataFields.categoryX = "hour"; var l = chart2.series.push(new am4charts.LineSeries()); l.name = "Tuesday"; l.stroke = am4core.color("#374c80"); l.strokeWidth = 2; -l.dataFields.valueY = "y2018_Tuesday_rv_average"; +l.dataFields.valueY = "Tuesday_rv_average"; l.dataFields.categoryX = "hour"; var l = chart2.series.push(new am4charts.LineSeries()); l.name = "Wednesday"; l.stroke = am4core.color("#7a5195"); l.strokeWidth = 2; -l.dataFields.valueY = "y2018_Wednesday_rv_average"; +l.dataFields.valueY = "Wednesday_rv_average"; l.dataFields.categoryX = "hour"; var l = chart2.series.push(new am4charts.LineSeries()); l.name = "Thursday"; l.stroke = am4core.color("#bc5090"); l.strokeWidth = 2; -l.dataFields.valueY = "y2018_Thursday_rv_average"; +l.dataFields.valueY = "Thursday_rv_average"; l.dataFields.categoryX = "hour"; var l = chart2.series.push(new am4charts.LineSeries()); l.name = "Friday"; l.stroke = am4core.color("#ef5675"); l.strokeWidth = 2; -l.dataFields.valueY = "y2018_Friday_rv_average"; +l.dataFields.valueY = "Friday_rv_average"; l.dataFields.categoryX = "hour"; var l = chart2.series.push(new am4charts.LineSeries()); l.name = "Saturday"; l.stroke = am4core.color("#ff764a"); l.strokeWidth = 2; -l.dataFields.valueY = "y2018_Saturday_rv_average"; +l.dataFields.valueY = "Saturday_rv_average"; l.dataFields.categoryX = "hour"; var l = chart2.series.push(new am4charts.LineSeries()); l.name = "Sunday"; l.stroke = am4core.color("#ffa600"); l.strokeWidth = 2; -l.dataFields.valueY = "y2018_Sunday_rv_average"; +l.dataFields.valueY = "Sunday_rv_average"; l.dataFields.categoryX = "hour"; {% endfor %}