From fbebd5f12c6f17e32ea52d42d3ac4d3e66d35e05 Mon Sep 17 00:00:00 2001 From: wayanrivan Date: Wed, 8 Jul 2026 22:54:35 +0700 Subject: [PATCH] update --- app/Http/Controllers/ReportsController.php | 702 ++++++++++----------- 1 file changed, 351 insertions(+), 351 deletions(-) diff --git a/app/Http/Controllers/ReportsController.php b/app/Http/Controllers/ReportsController.php index 87fd519..6cbc105 100644 --- a/app/Http/Controllers/ReportsController.php +++ b/app/Http/Controllers/ReportsController.php @@ -41,260 +41,15 @@ class ReportsController extends Controller UserLogs::insert(Auth::user()->id, $log); return view('menu_v1.reports.vehicle_trips', $data); } - // public function api_report_vehicle_trips_list(Request $req) - // { - // // $TIMEFIX = Helper::TIMEFIX; - // // Validate input - // // date in unix datetime format - // // dd($req->type); - // $rules = [ - // // 'from_date' => 'required|date', - // // 'to_date' => 'required|date|after_or_equal:from_date', - // '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'); - // // $to_date = $req->input('to_date'); - // $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'); - // // $from_date = 1756054800; - // // $to_date = 1756745940; - - // // get month year - // $date = Carbon::createFromTimestamp($from_date); - // $yymm = $date->format('ym'); - - // try { - // // $list = DB::select("WITH - // // gaps AS ( - // // SELECT - // // -- previous gap since previous row > 1 hour (3600s) - // // CASE - // // WHEN (crt_d - LAG(crt_d, 1, NULL) OVER (PARTITION BY vhc_id ORDER BY crt_d)) > 3600 - // // THEN 1 ELSE 0 - // // END AS isStop, - // // t.* - // // FROM tracks_2509 t - // // WHERE - // // t.latitude IS NOT NULL - // // AND t.longitude IS NOT NULL - // // AND t.action = 'location' - // // AND t.crt_d BETWEEN ? AND ? - // // ) - // // , trips AS ( - // // SELECT - // // -- mark the start of a trip when ignition=4 and previous ignition <> 4 - // // CASE - // // WHEN ignition = 4 - // // AND LAG(ignition, 1, 0) OVER (PARTITION BY vhc_id ORDER BY crt_d) <> 4 - // // or LAG(isStop, 1, 0) over (PARTITION BY vhc_id ORDER BY crt_d) = 1 - // // THEN 1 ELSE 0 - // // END AS trip_start, - // // g.* - // // FROM gaps g - // // ) - // // , numbered AS ( - // // SELECT - // // *, - // // -- assign a trip_id by cumulative sum of trip_start - // // SUM(trip_start) OVER (PARTITION BY vhc_id ORDER BY crt_d) AS trip_id - // // FROM trips - // // where - // // ignition = 4 - // // and isStop = 0 - // // ), - // // agg AS ( - // // SELECT - // // COUNT(*) AS row_count, - // // v.name, - // // v.nopol1, - // // vhc_id, - // // -- trip_id, - // // ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY MIN(a.crt_d)) AS trip_id, - // // SUM(pre_milleage) AS mileage, - // // MIN(a.crt_d) AS start, - // // MAX(a.crt_d) AS finish, - // // MIN(a.vhc_milleage) AS startMileage, - // // MAX(a.vhc_milleage) AS finishMileage, - // // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MIN(a.id) LIMIT 1) AS startLoc, - // // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MAX(a.id) LIMIT 1) AS finishLoc - // // FROM t_vehicles v - // // LEFT JOIN numbered a ON a.vhc_id = v.id - // // WHERE - // // v.dlt is null and trip_id != 0 - // // and if(? , v.id = ? , 1=1) - // // GROUP BY v.id, a.trip_id - // // HAVING COUNT(*) > 1 - // // ) - // // SELECT - // // *, - // // SUM(mileage) OVER (PARTITION BY agg.id) AS total_mileage, - // // COUNT(trip_id) OVER (PARTITION BY agg.id) AS total_trip, - // // tvd.pool_code, tvd.dc_code - // // FROM agg agg - // // join t_vehicles_detail tvd on tvd.vid = agg.vhc_id - // // ORDER BY agg.id, trip_id - // // ", [$from_date, $to_date, $vid, $vid]); - - // // $list = DB::select("WITH TotalMileage AS ( - // // SELECT id, SUM(mileage) AS total_mileage, count(*) total_trip - // // FROM trips - // // WHERE start BETWEEN ? AND ? - // // GROUP BY id - // // ) - // // SELECT - // // t.*, - // // tm.total_mileage, 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 if(? , t.id = ? , 1=1) - // // and if(? , vt.id = ? , 1=1) - // // and if(? , t.pool_code = ? , 1=1) - // // ", [$from_date, $to_date, $from_date, $to_date, $vid, $vid, $vt, $vt, $poolcode, $poolcode]); - // $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, - // ]); - // // // RETURN 1 - LIST - // // if($req->type != 'report'){ - // $apiResp = Responses::success("success list vehicles report"); - // $apiResp["data"] = $list; - // return new Response($apiResp, $apiResp["meta"]["code"]); - // // } - - // // // RETURN 2 - REPORT - // // if($req->type == 'report'){ - // // $headings = ['Name', 'License Plate', 'Number of Trip', 'Total Mileage']; - - // // $export = new class($list, $headings) implements FromArray, WithHeadings { - // // private $list; - // // private $headings; - - // // public function __construct($list, $headings) - // // { - // // $this->list = $list; - // // $this->headings = $headings; - // // } - - // // public function array(): array - // // { - // // return array_map(function ($item) { - // // return [ - // // $item->name, - // // $item->nopol1, - // // $item->numOfTrip, - // // $item->total_milleage, - // // ]; - // // }, $this->list); - // // } - - // // public function headings(): array - // // { - // // return $this->headings; - // // } - - // // // Start table from A3 - // // public function startCell(): string - // // { - // // return 'A3'; - // // } - - // // // Add title & border styling - // // public function styles(Worksheet $sheet) - // // { - // // $tgl0 = date('d-m-Y', $GLOBALS['from_date']); - // // $tgl1 = date('d-m-Y', $GLOBALS['to_date']); - - // // // Title in A1 - // // $sheet->setCellValue('A1', 'Vehicle Trip Report $tgl0 until $tgl1'); - // // $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); - // // $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); - // // $sheet->mergeCells('A1:D1'); // Merge across 4 columns - - // // // Get last row - // // $lastRow = $this->list->count() + 3; // 3 = heading row - // // $range = "A3:D{$lastRow}"; - - // // // Add borders - // // $sheet->getStyle($range)->getBorders()->getAllBorders() - // // ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); - - // // // Bold headings - // // $sheet->getStyle('A3:D3')->getFont()->setBold(true); - - // // return []; - // // } - // // }; - - // // return Excel::download($export, 'trip_report.xlsx'); - // // } - // } catch (\Exception $e) { - // $apiResp = Responses::error($e->getMessage()); - // return new Response($apiResp, $apiResp["meta"]["code"]); - // // return Responses::json(Responses::SERVER_ERROR, 'An error occurred while generating the report.', (object)[]); - // } - // } - public function api_report_vehicle_trips_list(Request $req) { + // $TIMEFIX = Helper::TIMEFIX; + // Validate input + // date in unix datetime format + // dd($req->type); $rules = [ + // 'from_date' => 'required|date', + // 'to_date' => 'required|date|after_or_equal:from_date', 'type' => 'nullable|in:report,list', // enum "report", "list". nullable default "list" ]; @@ -304,45 +59,142 @@ class ReportsController extends Controller return new Response($apiResp, $apiResp["meta"]["code"]); } + // $from_date = $req->input('from_date'); + // $to_date = $req->input('to_date'); $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'); + // $from_date = 1756054800; + // $to_date = 1756745940; + // get month year $date = Carbon::createFromTimestamp($from_date); $yymm = $date->format('ym'); try { + // $list = DB::select("WITH + // gaps AS ( + // SELECT + // -- previous gap since previous row > 1 hour (3600s) + // CASE + // WHEN (crt_d - LAG(crt_d, 1, NULL) OVER (PARTITION BY vhc_id ORDER BY crt_d)) > 3600 + // THEN 1 ELSE 0 + // END AS isStop, + // t.* + // FROM tracks_2509 t + // WHERE + // t.latitude IS NOT NULL + // AND t.longitude IS NOT NULL + // AND t.action = 'location' + // AND t.crt_d BETWEEN ? AND ? + // ) + // , trips AS ( + // SELECT + // -- mark the start of a trip when ignition=4 and previous ignition <> 4 + // CASE + // WHEN ignition = 4 + // AND LAG(ignition, 1, 0) OVER (PARTITION BY vhc_id ORDER BY crt_d) <> 4 + // or LAG(isStop, 1, 0) over (PARTITION BY vhc_id ORDER BY crt_d) = 1 + // THEN 1 ELSE 0 + // END AS trip_start, + // g.* + // FROM gaps g + // ) + // , numbered AS ( + // SELECT + // *, + // -- assign a trip_id by cumulative sum of trip_start + // SUM(trip_start) OVER (PARTITION BY vhc_id ORDER BY crt_d) AS trip_id + // FROM trips + // where + // ignition = 4 + // and isStop = 0 + // ), + // agg AS ( + // SELECT + // COUNT(*) AS row_count, + // v.name, + // v.nopol1, + // vhc_id, + // -- trip_id, + // ROW_NUMBER() OVER (PARTITION BY v.id ORDER BY MIN(a.crt_d)) AS trip_id, + // SUM(pre_milleage) AS mileage, + // MIN(a.crt_d) AS start, + // MAX(a.crt_d) AS finish, + // MIN(a.vhc_milleage) AS startMileage, + // MAX(a.vhc_milleage) AS finishMileage, + // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MIN(a.id) LIMIT 1) AS startLoc, + // (SELECT fulladdress FROM t_gps_tracks_address WHERE master_id = MAX(a.id) LIMIT 1) AS finishLoc + // FROM t_vehicles v + // LEFT JOIN numbered a ON a.vhc_id = v.id + // WHERE + // v.dlt is null and trip_id != 0 + // and if(? , v.id = ? , 1=1) + // GROUP BY v.id, a.trip_id + // HAVING COUNT(*) > 1 + // ) + // SELECT + // *, + // SUM(mileage) OVER (PARTITION BY agg.id) AS total_mileage, + // COUNT(trip_id) OVER (PARTITION BY agg.id) AS total_trip, + // tvd.pool_code, tvd.dc_code + // FROM agg agg + // join t_vehicles_detail tvd on tvd.vid = agg.vhc_id + // ORDER BY agg.id, trip_id + // ", [$from_date, $to_date, $vid, $vid]); + + // $list = DB::select("WITH TotalMileage AS ( + // SELECT id, SUM(mileage) AS total_mileage, count(*) total_trip + // FROM trips + // WHERE start BETWEEN ? AND ? + // GROUP BY id + // ) + // SELECT + // t.*, + // tm.total_mileage, 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 if(? , t.id = ? , 1=1) + // and if(? , vt.id = ? , 1=1) + // and if(? , t.pool_code = ? , 1=1) + // ", [$from_date, $to_date, $from_date, $to_date, $vid, $vid, $vt, $vt, $poolcode, $poolcode]); $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 - 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 = ?); - "; + 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; @@ -360,90 +212,238 @@ class ReportsController extends Controller $poolcode, $poolcode, ]); - - /** - * ========================================================== - * GET LAST GPS POSITION (YANG SUDAH PUNYA FULLADDRESS) - * ========================================================== - */ - $vehicleIds = collect($list) - ->pluck('vhc_id') - ->filter() - ->unique() - ->values() - ->toArray(); - - if (!empty($vehicleIds)) { - - $placeholders = implode(',', array_fill(0, count($vehicleIds), '?')); - - // NOTE: subquery "latest" sekarang INNER JOIN ke t_gps_tracks_address - // supaya titik yang dipilih adalah titik terbaru yang ADDRESS-nya - // sudah selesai di-generate, bukan titik paling akhir mutlak yang - // mungkin belum sempat di-reverse-geocode. - $gpsSql = " - SELECT - gt.vhc_id, - gt.latitude, - gt.longitude, - gt.speed, - gt.crt_d, - tgta.fulladdress - FROM t_gps_tracks gt - INNER JOIN t_gps_tracks_address tgta - ON tgta.master_id = gt.id - INNER JOIN ( - SELECT - gt2.vhc_id, - MAX(gt2.crt_d) AS last_crt_d - FROM t_gps_tracks gt2 - INNER JOIN t_gps_tracks_address tgta2 - ON tgta2.master_id = gt2.id - WHERE - gt2.action = 'location' - AND gt2.latitude IS NOT NULL - AND gt2.longitude IS NOT NULL - AND gt2.crt_d BETWEEN ? AND ? - AND gt2.vhc_id IN ($placeholders) - GROUP BY gt2.vhc_id - ) latest - ON latest.vhc_id = gt.vhc_id - AND latest.last_crt_d = gt.crt_d - "; - - $gpsParams = array_merge( - [$from_date, $to_date], - $vehicleIds - ); - - $gpsList = DB::select($gpsSql, $gpsParams); - - $gpsByVehicle = collect($gpsList)->keyBy('vhc_id'); - - foreach ($list as &$item) { - - $gps = $gpsByVehicle->get($item->vhc_id); - - $item->latitude = $gps->latitude ?? null; - $item->longitude = $gps->longitude ?? null; - $item->speed = $gps->speed ?? null; - $item->fulladdress = $gps->fulladdress ?? null; - $item->gps_time = $gps->crt_d ?? null; - } - - unset($item); - } - + // // RETURN 1 - LIST + // if($req->type != 'report'){ $apiResp = Responses::success("success list vehicles report"); $apiResp["data"] = $list; return new Response($apiResp, $apiResp["meta"]["code"]); + // } + // // RETURN 2 - REPORT + // if($req->type == 'report'){ + // $headings = ['Name', 'License Plate', 'Number of Trip', 'Total Mileage']; + + // $export = new class($list, $headings) implements FromArray, WithHeadings { + // private $list; + // private $headings; + + // public function __construct($list, $headings) + // { + // $this->list = $list; + // $this->headings = $headings; + // } + + // public function array(): array + // { + // return array_map(function ($item) { + // return [ + // $item->name, + // $item->nopol1, + // $item->numOfTrip, + // $item->total_milleage, + // ]; + // }, $this->list); + // } + + // public function headings(): array + // { + // return $this->headings; + // } + + // // Start table from A3 + // public function startCell(): string + // { + // return 'A3'; + // } + + // // Add title & border styling + // public function styles(Worksheet $sheet) + // { + // $tgl0 = date('d-m-Y', $GLOBALS['from_date']); + // $tgl1 = date('d-m-Y', $GLOBALS['to_date']); + + // // Title in A1 + // $sheet->setCellValue('A1', 'Vehicle Trip Report $tgl0 until $tgl1'); + // $sheet->getStyle('A1')->getFont()->setBold(true)->setSize(16); + // $sheet->getStyle('A1')->getAlignment()->setHorizontal('center'); + // $sheet->mergeCells('A1:D1'); // Merge across 4 columns + + // // Get last row + // $lastRow = $this->list->count() + 3; // 3 = heading row + // $range = "A3:D{$lastRow}"; + + // // Add borders + // $sheet->getStyle($range)->getBorders()->getAllBorders() + // ->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_THIN); + + // // Bold headings + // $sheet->getStyle('A3:D3')->getFont()->setBold(true); + + // return []; + // } + // }; + + // return Excel::download($export, 'trip_report.xlsx'); + // } } catch (\Exception $e) { $apiResp = Responses::error($e->getMessage()); return new Response($apiResp, $apiResp["meta"]["code"]); + // 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 { + // $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, + // ]); + + // /** + // * ========================================================== + // * GET LAST GPS POSITION (YANG SUDAH PUNYA FULLADDRESS) + // * ========================================================== + // */ + // $vehicleIds = collect($list) + // ->pluck('vhc_id') + // ->filter() + // ->unique() + // ->values() + // ->toArray(); + + // if (!empty($vehicleIds)) { + + // $placeholders = implode(',', array_fill(0, count($vehicleIds), '?')); + + // // NOTE: subquery "latest" sekarang INNER JOIN ke t_gps_tracks_address + // // supaya titik yang dipilih adalah titik terbaru yang ADDRESS-nya + // // sudah selesai di-generate, bukan titik paling akhir mutlak yang + // // mungkin belum sempat di-reverse-geocode. + // $gpsSql = " + // SELECT + // gt.vhc_id, + // gt.latitude, + // gt.longitude, + // gt.speed, + // gt.crt_d, + // tgta.fulladdress + // FROM t_gps_tracks gt + // INNER JOIN t_gps_tracks_address tgta + // ON tgta.master_id = gt.id + // INNER JOIN ( + // SELECT + // gt2.vhc_id, + // MAX(gt2.crt_d) AS last_crt_d + // FROM t_gps_tracks gt2 + // INNER JOIN t_gps_tracks_address tgta2 + // ON tgta2.master_id = gt2.id + // WHERE + // gt2.action = 'location' + // AND gt2.latitude IS NOT NULL + // AND gt2.longitude IS NOT NULL + // AND gt2.crt_d BETWEEN ? AND ? + // AND gt2.vhc_id IN ($placeholders) + // GROUP BY gt2.vhc_id + // ) latest + // ON latest.vhc_id = gt.vhc_id + // AND latest.last_crt_d = gt.crt_d + // "; + + // $gpsParams = array_merge( + // [$from_date, $to_date], + // $vehicleIds + // ); + + // $gpsList = DB::select($gpsSql, $gpsParams); + + // $gpsByVehicle = collect($gpsList)->keyBy('vhc_id'); + + // foreach ($list as &$item) { + + // $gps = $gpsByVehicle->get($item->vhc_id); + + // $item->latitude = $gps->latitude ?? null; + // $item->longitude = $gps->longitude ?? null; + // $item->speed = $gps->speed ?? null; + // $item->fulladdress = $gps->fulladdress ?? null; + // $item->gps_time = $gps->crt_d ?? null; + // } + + // unset($item); + // } + + // $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 view_report_trip_detail(Request $req) { $vid = $req->vid;