update
This commit is contained in:
@ -291,6 +291,146 @@ class ReportsController extends Controller
|
|||||||
// return Responses::json(Responses::SERVER_ERROR, 'An error occurred while generating the report.', (object)[]);
|
// return Responses::json(Responses::SERVER_ERROR, 'An error occurred while generating the report.', (object)[]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// public function api_report_vehicle_trips_list(Request $req)
|
||||||
|
// {
|
||||||
|
// $rules = [
|
||||||
|
// 'type' => 'nullable|in:report,list', // enum "report", "list". nullable default "list"
|
||||||
|
// ];
|
||||||
|
|
||||||
|
// $isValidInput = Validator::make($req->all(), $rules);
|
||||||
|
// if (!$isValidInput->passes()) {
|
||||||
|
// $apiResp = Responses::bad_input($isValidInput->messages()->first());
|
||||||
|
// return new Response($apiResp, $apiResp["meta"]["code"]);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $from_date = $req->input('from_date') - Helper::TIMEFIX;
|
||||||
|
// $to_date = $req->input('to_date') - Helper::TIMEFIX;
|
||||||
|
// $vid = $req->input('vid');
|
||||||
|
// $vt = $req->input('vt');
|
||||||
|
// $poolcode = $req->input('poolcode');
|
||||||
|
|
||||||
|
// $date = Carbon::createFromTimestamp($from_date);
|
||||||
|
// $yymm = $date->format('ym');
|
||||||
|
|
||||||
|
// try {
|
||||||
|
// // =========================================================
|
||||||
|
// // STEP 1 - Ambil data trips (TANPA gps lat/long dulu)
|
||||||
|
// // =========================================================
|
||||||
|
// $sql =
|
||||||
|
// "WITH TotalMileage AS (
|
||||||
|
// SELECT
|
||||||
|
// id,
|
||||||
|
// SUM(mileage) AS total_mileage,
|
||||||
|
// COUNT(*) AS total_trip
|
||||||
|
// FROM trips
|
||||||
|
// WHERE start BETWEEN ? AND ?
|
||||||
|
// GROUP BY id
|
||||||
|
// )
|
||||||
|
// SELECT
|
||||||
|
// t.*,
|
||||||
|
// tm.total_mileage,
|
||||||
|
// tm.total_trip,
|
||||||
|
// vt.name AS type_name,
|
||||||
|
// ROW_NUMBER() OVER (
|
||||||
|
// PARTITION BY t.id
|
||||||
|
// ORDER BY t.start
|
||||||
|
// ) AS trip_id
|
||||||
|
// FROM trips t
|
||||||
|
// JOIN TotalMileage tm ON t.id = tm.id
|
||||||
|
// LEFT JOIN t_vehicles tvt ON tvt.id = t.vhc_id
|
||||||
|
// LEFT JOIN t_vehicles_cats vt ON vt.id = tvt.cat_id
|
||||||
|
// WHERE
|
||||||
|
// t.start BETWEEN ? AND ?
|
||||||
|
// AND (? IS NULL OR t.id = ?)
|
||||||
|
// AND (? IS NULL OR vt.id = ?)
|
||||||
|
// AND (? IS NULL OR t.pool_code = ?);
|
||||||
|
// ";
|
||||||
|
|
||||||
|
// $vid = $vid ?: null;
|
||||||
|
// $vt = $vt ?: null;
|
||||||
|
// $poolcode = $poolcode ?: null;
|
||||||
|
|
||||||
|
// $list = DB::select($sql, [
|
||||||
|
// $from_date,
|
||||||
|
// $to_date,
|
||||||
|
// $from_date,
|
||||||
|
// $to_date,
|
||||||
|
// $vid,
|
||||||
|
// $vid,
|
||||||
|
// $vt,
|
||||||
|
// $vt,
|
||||||
|
// $poolcode,
|
||||||
|
// $poolcode,
|
||||||
|
// ]);
|
||||||
|
|
||||||
|
// // =========================================================
|
||||||
|
// // STEP 2 - Ambil SEMUA titik GPS relevan dalam 1x query saja
|
||||||
|
// // (bukan per trip, tapi sekali untuk seluruh vhc_id yang muncul
|
||||||
|
// // di hasil trips, dalam rentang tanggal laporan)
|
||||||
|
// // =========================================================
|
||||||
|
// if (count($list) > 0) {
|
||||||
|
// $vhcIds = array_values(array_unique(array_map(function ($t) {
|
||||||
|
// return $t->vhc_id;
|
||||||
|
// }, $list)));
|
||||||
|
|
||||||
|
// $placeholders = implode(',', array_fill(0, count($vhcIds), '?'));
|
||||||
|
|
||||||
|
// $gpsPoints = DB::select("
|
||||||
|
// SELECT vhc_id, crt_d, latitude, longitude
|
||||||
|
// FROM t_gps_tracks
|
||||||
|
// WHERE vhc_id IN ({$placeholders})
|
||||||
|
// AND crt_d BETWEEN ? AND ?
|
||||||
|
// AND latitude IS NOT NULL
|
||||||
|
// AND longitude IS NOT NULL
|
||||||
|
// ORDER BY vhc_id ASC, crt_d ASC
|
||||||
|
// ", array_merge($vhcIds, [$from_date, $to_date]));
|
||||||
|
|
||||||
|
// // =========================================================
|
||||||
|
// // STEP 3 - Kelompokkan titik GPS per vhc_id (sudah urut crt_d ASC)
|
||||||
|
// // =========================================================
|
||||||
|
// $gpsByVehicle = [];
|
||||||
|
// foreach ($gpsPoints as $g) {
|
||||||
|
// $gpsByVehicle[$g->vhc_id][] = $g;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // =========================================================
|
||||||
|
// // STEP 4 - Cari titik pertama & terakhir per trip di memori PHP
|
||||||
|
// // (bukan lewat query DB lagi, jadi murah)
|
||||||
|
// // =========================================================
|
||||||
|
// foreach ($list as $t) {
|
||||||
|
// $points = $gpsByVehicle[$t->vhc_id] ?? [];
|
||||||
|
|
||||||
|
// $startPoint = null;
|
||||||
|
// $finishPoint = null;
|
||||||
|
|
||||||
|
// foreach ($points as $p) {
|
||||||
|
// if ($p->crt_d < $t->start || $p->crt_d > $t->finish) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// if ($startPoint === null) {
|
||||||
|
// $startPoint = $p; // titik pertama dalam rentang trip
|
||||||
|
// }
|
||||||
|
// $finishPoint = $p; // terus diupdate sampai titik terakhir dalam rentang
|
||||||
|
// }
|
||||||
|
|
||||||
|
// $t->start_latitude = $startPoint->latitude ?? null;
|
||||||
|
// $t->start_longitude = $startPoint->longitude ?? null;
|
||||||
|
// $t->finish_latitude = $finishPoint->latitude ?? null;
|
||||||
|
// $t->finish_longitude = $finishPoint->longitude ?? null;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // =========================================================
|
||||||
|
// // RETURN
|
||||||
|
// // =========================================================
|
||||||
|
// $apiResp = Responses::success("success list vehicles report");
|
||||||
|
// $apiResp["data"] = $list;
|
||||||
|
// return new Response($apiResp, $apiResp["meta"]["code"]);
|
||||||
|
// } catch (\Exception $e) {
|
||||||
|
// $apiResp = Responses::error($e->getMessage());
|
||||||
|
// return new Response($apiResp, $apiResp["meta"]["code"]);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
// public function api_report_vehicle_trips_list(Request $req)
|
// public function api_report_vehicle_trips_list(Request $req)
|
||||||
// {
|
// {
|
||||||
|
|||||||
Reference in New Issue
Block a user