From 3e6ea0b3d4fddf57d3673b26febc44f393c27243 Mon Sep 17 00:00:00 2001 From: meusinfirmary Date: Wed, 23 Jul 2025 04:44:20 +0700 Subject: [PATCH] update --- app/Http/Controllers/TrackController.php | 12 +- app/Http/Controllers/UsersController.php | 234 +++++-- app/Models/Tracks.php | 699 +++++++++++++------- app/Models/Tracks_copy.php | 47 -- public/index.php | 2 +- resources/views/menu_v1/_profile.blade.php | 26 +- resources/views/menu_v1/dashboard.blade.php | 13 +- resources/views/template/navbar.blade.php | 7 - routes/web.php | 3 + 9 files changed, 641 insertions(+), 402 deletions(-) diff --git a/app/Http/Controllers/TrackController.php b/app/Http/Controllers/TrackController.php index 94357bc..214a7b1 100755 --- a/app/Http/Controllers/TrackController.php +++ b/app/Http/Controllers/TrackController.php @@ -24,19 +24,11 @@ class TrackController extends Controller $now = time(); $input = []; $rulesInput = []; - - // validasi input - // $isValidInput = Validator::make($input, $rulesInput); - // if (!$isValidInput->passes()) { - // $apiResp = Responses::bad_input($isValidInput->messages()->first()); - // return new Response($apiResp, $apiResp['meta']['code']); - // } $filter = [ "get_order_data" => 1, ]; if ($req->cptid) { $filter["company"] = $req->cptid; - // $filter["company"] = 1; } if ($req->auth->is_tracking === Users::IS_TRACK_VHC_YES) { @@ -75,7 +67,6 @@ class TrackController extends Controller $filter["vids"][] = $v->vhc_id; } } elseif ($req->auth->role === Users::ROLE_SPECIAL_TRACKING) { - // $filter['vid'] = 0; $filter["company"] = $req->auth->client_group_id; } else { $filter["vid"] = 0; @@ -88,8 +79,7 @@ class TrackController extends Controller // dd($list); foreach ($list as $key => $row) { $list[$key]->DT_RowIndex = $key + 1; - // $list[$key]->mileage_km = '-'; - $list[$key]->track_schedule = $row->track_sch_h . "/" . $row->track_sch_d; // combine track_sch_h + track_sch_d + $list[$key]->is_track_holiday_text = $list[$key]->is_track_holiday == Vehicles::ENABLED_TRACK_HOLIDAY ? "Enabled" : "Disabled"; $list[$key]->alert_zones = "-"; diff --git a/app/Http/Controllers/UsersController.php b/app/Http/Controllers/UsersController.php index 66d1fa5..0f59bb3 100755 --- a/app/Http/Controllers/UsersController.php +++ b/app/Http/Controllers/UsersController.php @@ -454,24 +454,163 @@ class UsersController extends Controller return new Response($apiResp, $apiResp["meta"]["code"]); } - // if ($req->roles == Users::ROLE_VENDOR) { - // if (!$req->bank_id) { - // $apiResp = Responses::bad_request("bank wajib diisi"); - // return new Response($apiResp, $apiResp["meta"]["code"]); - // } - // if (!$req->bank_branch_name) { - // $apiResp = Responses::bad_request("bank kcp wajib diisi"); - // return new Response($apiResp, $apiResp["meta"]["code"]); - // } - // if (!$req->bank_acc_number) { - // $apiResp = Responses::bad_request("nomor rekening wajib diisi"); - // return new Response($apiResp, $apiResp["meta"]["code"]); - // } - // if (!$req->bank_acc_name) { - // $apiResp = Responses::bad_request("nama pemilik rekening wajib diisi"); - // return new Response($apiResp, $apiResp["meta"]["code"]); - // } - // } + $uniqEmail = Users::getUserByEmail($req->email); + if (count($uniqEmail) > 0) { + $notSameUser = 1; + foreach ($uniqEmail as $key => $row) { + if ($row->id == $req->uid) { + $notSameUser = 0; + } + } + if ($notSameUser) { + $apiResp = Responses::bad_request("email has been used"); + return new Response($apiResp, $apiResp["meta"]["code"]); + } + } + $uniqPhone = Users::getUserByPhone($req->phone); + if (count($uniqPhone) > 0) { + $notSameUser = 1; + foreach ($uniqPhone as $key => $row) { + if ($row->id == $req->uid) { + $notSameUser = 0; + } + } + if ($notSameUser) { + $apiResp = Responses::bad_request("phone has been used"); + return new Response($apiResp, $apiResp["meta"]["code"]); + } + } + + $vhcs = null; + if ($req->is_tracking == Users::IS_TRACK_VHC_YES) { + if (!$req->vehicles) { + $apiResp = Responses::bad_request("vehicles must be filled"); + return new Response($apiResp, $apiResp["meta"]["code"]); + } + foreach ($req->vehicles as $k => $v) { + $vhcs .= $v . ","; + } + if ($vhcs) { + if (substr($vhcs, -1) === ",") { + $vhcs = substr($vhcs, 0, -1); + } + } + } + $data["is_tracking"] = $req->is_tracking; + $data["vhcs"] = $vhcs; + + $data["updt"] = $now; + $data["updt_by"] = $req->auth->uid; + + $data["role"] = 2; + + DB::beginTransaction(); + + Users::updateUser($req->uid, $data); + + if ($req->roles) { + DB::table("model_has_roles") + ->where("model_id", $req->uid) + ->delete(); + + DB::table("model_has_roles")->insert([ + "role_id" => $req->roles, + "model_type" => "App\\User", + "model_id" => $req->uid, + ]); + } + + $apiResp = Responses::created("success update user"); + + DB::commit(); + return new Response($apiResp, $apiResp["meta"]["code"]); + } catch (\Exception $e) { + DB::rollBack(); + $apiResp = Responses::error($e->getMessage()); + return new Response($apiResp, $apiResp["meta"]["code"]); + } + } + public function api_edit_user_profile(Request $req) + { + try { + $now = time(); + $roles = Users::arrRoles(); + $statuses = Users::arrStatus(); + + $input = [ + "uid" => $req->uid, + "is_tracking" => $req->is_tracking, + "vehicles" => $req->vehicles, + "bank_id" => $req->bank_id, + "bank_code" => $req->bank_code, + "bank_short" => $req->bank_short, + "bank_name" => $req->bank_name, + "bank_kcp" => $req->bank_branch_name, + "bank_acc_number" => $req->bank_acc_number, + "bank_acc_name" => $req->bank_acc_name, + "is_vdr_bcng" => $req->is_vdr_bcng, + ]; + $rulesInput = [ + "uid" => "required|integer|not_in:0", + "is_tracking" => "nullable|numeric", + "vehicles" => "nullable|array", + "bank_id" => "nullable|integer|not_in:0", + "bank_code" => "nullable|numeric", + "bank_short" => "nullable|string", + "bank_name" => "nullable|string", + "bank_kcp" => "nullable|string", + "bank_acc_number" => "nullable|numeric", + "bank_acc_name" => "nullable|string|max:255", + "is_vdr_bcng" => "nullable|numeric", + ]; + $data = [ + "id" => $req->uid, + ]; + + if ($req->first_name) { + $input["first_name"] = $req->first_name; + $rulesInput["first_name"] = "required|string|max:125"; + $data["first_name"] = $req->first_name; + } + if ($req->last_name) { + $input["last_name"] = $req->last_name; + $rulesInput["last_name"] = "required|string|max:125"; + $data["last_name"] = $req->last_name ?? null; + } + if ($req->email) { + $input["email"] = $req->email; + $rulesInput["email"] = "required|email"; + $data["email"] = $req->email; + } + if ($req->phone) { + $input["phone"] = $req->phone; + $rulesInput["phone"] = "required|integer|not_in:0"; + $data["phone"] = $req->phone; + $data["phone_code"] = Users::DEFAULT_PHONE_CODE; + } + if ($req->fulladdress) { + $input["fulladdress"] = $req->fulladdress; + $rulesInput["fulladdress"] = "required|string|min:45"; + $data["fulladdress"] = $req->fulladdress; + } + if ($req->password) { + $input["password"] = $req->password; + $rulesInput["password"] = "required|string"; + $data["password"] = Hash::make($req->password); + } + + // validasi input + $isValidInput = Validator::make($input, $rulesInput); + if (!$isValidInput->passes()) { + $apiResp = Responses::bad_input($isValidInput->messages()->first()); + return new Response($apiResp, $apiResp["meta"]["code"]); + } + + $getUser = Users::getUserById($req->uid); + if (count($getUser) < 1) { + $apiResp = Responses::not_found("user not found"); + return new Response($apiResp, $apiResp["meta"]["code"]); + } $uniqEmail = Users::getUserByEmail($req->email); if (count($uniqEmail) > 0) { @@ -499,67 +638,20 @@ class UsersController extends Controller return new Response($apiResp, $apiResp["meta"]["code"]); } } - // $uniqCPhone = Clients::getClientByPhone($req->phone); - // if (count($uniqCPhone) > 0) { - // $notSameUser = 1; - // foreach ($uniqCPhone as $key => $row) { - // if ($row->id == $getUser[0]->client_id) { - // $notSameUser = 0; - // } - // } - // if ($notSameUser) { - // $apiResp = Responses::bad_request('phone has been used'); - // return (new Response($apiResp, $apiResp['meta']['code'])); - // } - // } - - $vhcs = null; - if ($req->is_tracking == Users::IS_TRACK_VHC_YES) { - if (!$req->vehicles) { - $apiResp = Responses::bad_request("vehicles must be filled"); - return new Response($apiResp, $apiResp["meta"]["code"]); - } - foreach ($req->vehicles as $k => $v) { - $vhcs .= $v . ","; - } - if ($vhcs) { - if (substr($vhcs, -1) === ",") { - $vhcs = substr($vhcs, 0, -1); - } - } - } - $data["is_tracking"] = $req->is_tracking; - $data["vhcs"] = $vhcs; - - // if ($req->roles == Users::ROLE_VENDOR) { - // $data["bank_id"] = $req->bank_id; - // $data["bank_code"] = $req->bank_code; - // $data["bank_name"] = $req->bank_name; - // $data["bank_short_name"] = $req->bank_short; - // $data["bank_branch_name"] = $req->bank_branch_name; - // $data["bank_acc_number"] = $req->bank_acc_number; - // $data["bank_acc_name"] = $req->bank_acc_name; - // $data["is_vdr_bcng"] = $req->is_vdr_bcng; - // } - - $data["updt"] = $now; - $data["updt_by"] = $req->auth->uid; - - $data["role"] = 2; DB::beginTransaction(); Users::updateUser($req->uid, $data); - DB::table("model_has_roles") - ->where("model_id", $req->uid) - ->delete(); - if ($req->roles) { + DB::table("model_has_roles") + ->where("model_id", $req->uid) + ->delete(); + DB::table("model_has_roles")->insert([ "role_id" => $req->roles, - "model_type" => "App\\User", // atau 'App\User' tergantung struktur kamu - "model_id" => $req->uid, // ID user-nya + "model_type" => "App\\User", + "model_id" => $req->uid, ]); } diff --git a/app/Models/Tracks.php b/app/Models/Tracks.php index 9e6ad1b..8eb7b15 100755 --- a/app/Models/Tracks.php +++ b/app/Models/Tracks.php @@ -49,262 +49,471 @@ class Tracks extends Model * device sudah sampai dilokasi pengantaran dan dimatikan, ketika dipakai lagi data tracking yang lama kelihatan dan loncat * untuk mengatasi itu di service_tracking juga perlu validasi tambahan, entah seperti apa caranya */ + + // public static function listCurrentTracks($filter = []) + // { + // $now = time(); + // $params = []; + + // $query = "SELECT"; + // $query .= + // " v.id as vid,v.device_id,v.name as vhc_name,c.name as vhc_cat_name,t.name as vhc_type_name"; + // $query .= " ,v.nopol1,v.nopol2,v.nopol3,vd.fvhc_img"; + // $query .= " ,v.is_track_holiday,v.track_sch_d,v.track_sch_h,vd.speed_limit,v.crt as vhc_crt"; + // $query .= " ,client.id as client_group_id,client.c_name as client_group_name"; + // $query .= " ,tr.ignition,tr.stts_engine,tr.stts_gps,tr.stts_gsm"; + // $query .= " ,tr.pre_milleage,tr.sum_milleage,tr.vhc_milleage,v.sum_milleage AS vhc_sum_milleage_1"; + + // // FRO + // // $query .= " ,(SELECT SUM(pre_milleage) FROM " . self::T_TRACKS . " WHERE vhc_id = v.id LIMIT 1) as vhc_sum_milleage"; + + // // $query .= " ,(SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine = " . self::STTS_EN_IDLING . " AND vhc_id = v.id AND crt_s >= ( + // // SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine IN (" . self::STTS_EN_STOPING . "," . self::STTS_EN_MOVING . ") AND vhc_id = v.id AND crt_s <= tr.crt_s ORDER BY id DESC LIMIT 1 + // // ) ORDER BY id ASC LIMIT 1) as lst_idle_at"; + + // // $query .= " ,(SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine = " . self::STTS_EN_STOPING . " AND vhc_id = v.id AND crt_s >= ( + // // SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine IN (" . self::STTS_EN_IDLING . "," . self::STTS_EN_MOVING . ") AND vhc_id = v.id AND crt_s <= tr.crt_s ORDER BY id DESC LIMIT 1 + // // ) ORDER BY id ASC LIMIT 1) as lst_stop_at"; + + // $query .= + // " ,tr.id AS lst_master_id,tr.latitude AS lst_lat,tr.longitude AS lst_lng,tr.speed AS lst_speed,tr.orientation AS lst_orientation"; + // $query .= " ,tr.crt AS lst_loc_crt,tr.crt_d AS lst_loc_crt_d,tr.crt_s AS lst_loc_crt_s"; + // $query .= + // " ,tr_addr.master_id AS lst_addr_master_id,tr_addr.country_text AS lst_country_text,tr_addr.state_text AS lst_state_text,tr_addr.city_text AS lst_city_text"; + // $query .= + // " ,tr_addr.district_text AS lst_district_text,tr_addr.village_text AS lst_village_text,tr_addr.postcode AS lst_postcode"; + // $query .= " ,tr_addr.streets AS lst_streets,tr_addr.fulladdress AS lst_fulladdress"; + + // // FRO + // // $query .= " ,(SELECT COUNT(id) FROM " . self::T_TRACKS . " WHERE vhc_id = v.id AND action = 'heartbeat' AND crt BETWEEN ".($now-(10*60))." AND ".$now." LIMIT 1) as lst_heartbeat"; // heartbeat last data on further 10 minutes + + // if (isset($filter["active_rates"])) { + // $query .= + // ",rate.vdr_id as rate_vdr_id,rate.vhc_type as rate_vhc_type,rate.origin_prov as rate_origin_prov,rate.dest_city as rate_dest_city,rate.dest_district as rate_dest_district"; + // $query .= + // ",rate.fast_time as rate_fast_time,rate.long_time as rate_long_time,rate.sell_kg as rate_sell_kg,rate.sell_cbm as rate_sell_cbm,rate.sell_ftl as rate_sell_ftl"; + // } + // if (isset($filter["get_order_data"])) { + // $query .= + // ",ord.id as ord_id,ord.code as ord_code,ord.status as ord_stts,ord.crt as ord_crt,ord_pck.pck_name as ord_pck_name,ord_pck.pck_addr as ord_pck_addr,ord_drop.drop_name as ord_drop_name,ord_drop.drop_addr as ord_drop_addr"; + // $query .= + // ",(SELECT nmKotamadyaKel FROM t_region WHERE kodeKab = ord_pck.pck_ktid LIMIT 1) ord_pck_ktname, (SELECT nmKotamadyaKel FROM t_region WHERE kodeKab = ord_drop.drop_ktid LIMIT 1) ord_drop_ktname"; + // $query .= + // ",ord_drv.drv_name as ord_drv_name,ord_drv.drv_phone_val as ord_drv_phone_val,ord_drv.drv_phone2_val as ord_drv_phone2_val,ord_drv.drv_addr as ord_drv_addr"; + // $query .= ",ord_c.c_name as ord_c_name,ord_c.c_pt_name as ord_c_pt_name"; + // } + // $query .= " FROM t_vehicles AS v"; + // $query .= " INNER JOIN t_vehicles_detail AS vd ON v.id = vd.vid"; + // $query .= " INNER JOIN t_vehicles_types AS t ON v.type_id = t.id"; + // $query .= " INNER JOIN t_vehicles_cats AS c ON v.cat_id = c.id"; + // $query .= " LEFT JOIN t_users AS vendor ON v.vendor_id = vendor.id"; + // $query .= " LEFT JOIN t_clients AS client ON vendor.client_group_id = client.id"; + // // get last updated row from many rows + // // $query .= " LEFT JOIN ( SELECT MAX(crt) max_crt, device_id FROM " . self::T_TRACKS . " WHERE latitude is not null AND longitude is not null GROUP BY device_id ORDER BY crt DESC ) AS tr1 ON (v.device_id = tr1.device_id)"; // cara lama berlaku utk gps tracker saja + // // // $query .= " LEFT JOIN ( SELECT MAX(crt) max_crt, device_id, vhc_id FROM " . self::T_TRACKS . " WHERE latitude is not null AND longitude is not null GROUP BY vhc_id ORDER BY crt DESC ) AS tr1 ON (v.id = tr1.vhc_id)"; // support gps tracker dan smartphone / apapun yang mempunyai device_id(IMEI) + // // $query .= " LEFT JOIN " . self::T_TRACKS . " AS tr ON (tr.crt = tr1.max_crt)"; + // // get last updated tracking from updated table realtime + // // $query .= " LEFT JOIN db_trucking.t_gps_tracks_rltm AS tr ON tr.vhc_id = v.id"; + // $query .= " LEFT JOIN t_gps_tracks_rltm AS tr ON tr.vhc_id = v.id"; + // // $query .= " LEFT JOIN " . self::T_TRACKS_ADDR . " AS tr_addr ON tr.id = tr_addr.master_id"; + + // //FRO + // $query .= + // " LEFT JOIN " . + // self::T_TRACKS_ADDR . + // " AS tr_addr ON tr.latitude = tr_addr.lat and tr.longitude = tr_addr.lng"; + + // if (isset($filter["active_rates"])) { + // // $query .= " INNER JOIN t_conf_rates as rate ON v.type_id = rate.vhc_type"; + // $query .= " INNER JOIN t_conf_rates as rate ON v.vendor_id = rate.vdr_id"; + // } + // if (isset($filter["get_order_data"])) { + // // the old way => only 1 order 1 vehicle + // $query .= " LEFT JOIN t_orders as ord ON v.ord_id = ord.id"; + // $query .= " LEFT JOIN t_orders_pickups as ord_pck ON v.ord_id = ord_pck.ord_id"; + // $query .= " LEFT JOIN t_orders_drops as ord_drop ON v.ord_id = ord_drop.ord_id"; + // $query .= " LEFT JOIN t_orders_drivers as ord_drv ON v.ord_id = ord_drv.ord_id"; + // $query .= " LEFT JOIN t_orders_clients as ord_c ON v.ord_id = ord_c.ord_id"; + + // // the new way => can handle 2 order in 1 vehicle + // // $query .= " LEFT JOIN t_orders_vehicles as ord_vhc ON v.id = ord_vhc.vhc_id"; + // // $query .= " LEFT JOIN t_orders as ord ON ord_vhc.ord_id = ord.id"; + // // $query .= " LEFT JOIN t_orders_pickups as ord_pck ON ord_vhc.ord_id = ord_pck.ord_id"; + // // $query .= " LEFT JOIN t_orders_drops as ord_drop ON ord_vhc.ord_id = ord_drop.ord_id"; + // // $query .= " LEFT JOIN t_orders_drivers as ord_drv ON ord_vhc.ord_id = ord_drv.ord_id"; + // // $query .= " LEFT JOIN t_orders_clients as ord_c ON ord_vhc.ord_id = ord_c.ord_id"; + // } + // $query .= " WHERE v.dlt is null"; + // // $query .= " AND tr.action IN ('location','alarm')"; // kalo gamau ngambil data heartbeat(idling) + // // $query .= " AND tr.device_id = v.device_id"; // cara lama berlaku utk gps tracker saja + // // $query .= " AND tr.vhc_id = v.id"; // support gps tracker dan smartphone / apapun yang mempunyai device_id(IMEI) // bikin lemot + // $query .= " AND tr.latitude != 0 AND tr.latitude is not null"; + // if (isset($filter["status"])) { + // $query .= " AND v.status = ?"; + // $params[] = $filter["status"]; + // } + // if (isset($filter["is_in_ord"])) { + // $query .= " AND v.is_in_ord = ?"; + // $params[] = $filter["is_in_ord"]; + // } + // if (isset($filter["nopol1"]) && isset($filter["nopol2"]) && isset($filter["nopol3"])) { + // $query .= " AND v.nopol1 = ? AND v.nopol2 = ? AND v.nopol3 = ?"; + // array_push($params, $filter["nopol1"], $filter["nopol2"], $filter["nopol3"]); + // } + // if (isset($filter["vid"])) { + // $query .= " AND v.id = ?"; + // $params[] = $filter["vid"]; + // } + // if (isset($filter["vids"])) { + // if ($filter["vids"] && count($filter["vids"]) > 0) { + // $binds_vids = ""; + // foreach ($filter["vids"] as $k => $v) { + // $binds_vids .= "?,"; + // $params[] = $v; + // } + // if (substr($binds_vids, -1) === ",") { + // $binds_vids = substr($binds_vids, 0, -1); + // } + // $query .= " AND v.id IN ($binds_vids)"; + // } else { + // $query .= " AND v.id = ?"; + // $params[] = 0; + // } + // } + // if (isset($filter["own_by_vdr_id"])) { + // $query .= " AND v.vendor_id = ?"; + // $params[] = $filter["own_by_vdr_id"]; + // } + // if (isset($filter["active_rates"])) { + // // v1 + // // $query .= " AND rate.vdr_id != 0 AND rate.dest_city != 0 AND rate.dest_district != 0"; + // // $query .= " AND rate.origin_prov = ? AND (rate.dest_city = ? OR rate.dest_district = ?) AND rate.sell_kg = ? AND rate.sell_cbm = ? AND rate.long_time = ?"; + // // array_push($params, $filter['active_rates']->origin_prov, $filter['active_rates']->dest_city, $filter['active_rates']->dest_district, $filter['active_rates']->sell_kg, $filter['active_rates']->sell_cbm, $filter['active_rates']->long_time); + // // v2 + // $query .= + // " AND rate.vdr_id != 0 AND rate.dest_city != 0 AND rate.is_active = " . ConfRates::IS_ACTIVE; + // $query .= + // " AND rate.origin_prov = ? AND (rate.dest_city = ? OR rate.dest_district = ?) AND rate.sell_ftl = ? AND rate.long_time = ?"; + // array_push( + // $params, + // $filter["active_rates"]->origin_prov, + // $filter["active_rates"]->dest_city, + // $filter["active_rates"]->dest_district, + // $filter["active_rates"]->sell_ftl, + // $filter["active_rates"]->long_time + // ); + // } + // if (isset($filter["prefer_truck_type"])) { + // $query .= " AND v.type_id = ?"; + // $params[] = $filter["prefer_truck_type"]; + // } + // if (isset($filter["get_order_data"])) { + // if (isset($filter["client_id"])) { + // $query .= " AND ord_c.c_id = ?"; + // $params[] = $filter["client_id"]; + // } + // // $query .= " AND ord.status IN (22,4)"; + // } + // if (isset($filter["company"])) { + // $query .= " AND client.id = ?"; + // $params[] = $filter["company"]; + // } + + // // $query .= " AND v.id = 70"; + + // $query .= " GROUP BY v.id"; + // $query .= " ORDER BY tr.crt_d DESC"; + // $query .= " LIMIT 500;"; + + // // dd($query); + + // $list = DB::select($query, $params); + // foreach ($list as $_list) { + // $_query = + // " SELECT SUM(pre_milleage) as vhc_sum_milleage FROM " . self::T_TRACKS . " WHERE vhc_id = ?"; + // $_query = DB::select($_query, [$_list->vid]); + // $_list->vhc_sum_milleage = $_query[0]->vhc_sum_milleage; + + // $_query = + // " + // SELECT + // crt_s as lst_idle_at + // FROM + // " . + // self::T_TRACKS . + // " + // WHERE + // stts_engine = " . + // self::STTS_EN_IDLING . + // " + // AND vhc_id = ? + // AND crt_s >= ( + // SELECT + // crt_s + // FROM + // " . + // self::T_TRACKS . + // " + // WHERE + // stts_engine IN ( + // " . + // self::STTS_EN_STOPING . + // ", + // " . + // self::STTS_EN_MOVING . + // ") + // AND vhc_id = ? + // AND crt_s <= ? + // ORDER BY + // id DESC + // LIMIT 1 + // ) + // ORDER BY + // id ASC + // LIMIT 1"; + // $_query = DB::select($_query, [$_list->vid, $_list->vid, $_list->lst_loc_crt_s]); + // $_list->lst_idle_at = count($_query) == 0 ? "" : $_query[0]->lst_idle_at; + + // $_query = + // "SELECT crt_s as lst_stop_at FROM " . + // self::T_TRACKS . + // " WHERE stts_engine = " . + // self::STTS_EN_STOPING . + // " AND vhc_id = ? AND crt_s >= ( + // SELECT crt_s FROM " . + // self::T_TRACKS . + // " WHERE stts_engine IN (" . + // self::STTS_EN_IDLING . + // "," . + // self::STTS_EN_MOVING . + // ") AND vhc_id = ? AND crt_s <= ? ORDER BY id DESC LIMIT 1 + // ) ORDER BY id ASC LIMIT 1 "; + // $_query = DB::select($_query, [$_list->vid, $_list->vid, $_list->lst_loc_crt_s]); + // $_list->lst_stop_at = count($_query) == 0 ? "" : $_query[0]->lst_stop_at; + + // $_query = + // " SELECT COUNT(id) as lst_heartbeat FROM " . + // self::T_TRACKS . + // " WHERE vhc_id = ? AND action = 'heartbeat' AND crt BETWEEN " . + // ($now - 10 * 60) . + // " AND " . + // $now . + // " LIMIT 1"; + // $_query = DB::select($_query, [$_list->vid]); + // $_list->lst_heartbeat = count($_query) == 0 ? "" : $_query[0]->lst_heartbeat; + // } + // // em + // return $list; + // } + + // public static function listCurrentTracks($filter = []) + // { + // $now = time(); + // $params = []; + + // $query = "SELECT"; + // $query .= + // " v.id as vid,v.device_id,v.name as vhc_name,c.name as vhc_cat_name,t.name as vhc_type_name"; + // $query .= " ,v.nopol1,v.nopol2,v.nopol3,vd.fvhc_img"; + // $query .= " ,v.is_track_holiday,v.track_sch_d,v.track_sch_h,vd.speed_limit,v.crt as vhc_crt"; + // $query .= " ,client.id as client_group_id,client.c_name as client_group_name"; + // $query .= " ,tr.ignition,tr.stts_engine,tr.stts_gps,tr.stts_gsm"; + // $query .= " ,tr.pre_milleage,tr.sum_milleage,tr.vhc_milleage,v.sum_milleage AS vhc_sum_milleage_1"; + + // $query .= + // " ,tr.id AS lst_master_id,tr.latitude AS lst_lat,tr.longitude AS lst_lng,tr.speed AS lst_speed,tr.orientation AS lst_orientation"; + // $query .= " ,tr.crt AS lst_loc_crt,tr.crt_d AS lst_loc_crt_d,tr.crt_s AS lst_loc_crt_s"; + // $query .= + // " ,tr_addr.master_id AS lst_addr_master_id,tr_addr.country_text AS lst_country_text,tr_addr.state_text AS lst_state_text,tr_addr.city_text AS lst_city_text"; + // $query .= + // " ,tr_addr.district_text AS lst_district_text,tr_addr.village_text AS lst_village_text,tr_addr.postcode AS lst_postcode"; + // $query .= " ,tr_addr.streets AS lst_streets,tr_addr.fulladdress AS lst_fulladdress"; + + // $query .= " FROM t_vehicles AS v"; + // $query .= " INNER JOIN t_vehicles_detail AS vd ON v.id = vd.vid"; + // $query .= " INNER JOIN t_vehicles_types AS t ON v.type_id = t.id"; + // $query .= " INNER JOIN t_vehicles_cats AS c ON v.cat_id = c.id"; + // $query .= " LEFT JOIN t_users AS vendor ON v.vendor_id = vendor.id"; + // $query .= " LEFT JOIN t_clients AS client ON vendor.client_group_id = client.id"; + // $query .= " LEFT JOIN t_gps_tracks_rltm AS tr ON tr.vhc_id = v.id"; + // $query .= + // " LEFT JOIN t_gps_tracks_address AS tr_addr ON tr.latitude = tr_addr.lat and tr.longitude = tr_addr.lng"; + + // $query .= " WHERE v.dlt is null"; + // $query .= " AND tr.latitude != 0 AND tr.latitude is not null"; + // $query .= " GROUP BY v.id"; + // $query .= " ORDER BY tr.crt_d DESC"; + // $query .= " LIMIT 500;"; + + // $list = DB::select($query, $params); + // foreach ($list as $_list) { + // $_query = "SELECT sum_milleage as vhc_sum_milleage FROM t_vehicles WHERE id = ?"; + // $_query = DB::select($_query, [$_list->vid]); + // $_list->vhc_sum_milleage = $_query[0]->vhc_sum_milleage ?? 0; + + // $_query = " + // SELECT + // crt_s as lst_idle_at + // FROM + // t_gps_tracks + // WHERE + // stts_engine = 2 + // AND vhc_id = ? + // AND crt_s >= ( + // SELECT + // crt_s + // FROM + // t_gps_tracks + // WHERE + // stts_engine IN (0, 1) + // AND vhc_id = ? + // AND crt_s <= ? + // ORDER BY + // id DESC + // LIMIT 1 + // ) + // ORDER BY + // id ASC + // LIMIT 1"; + // $_query = DB::select($_query, [$_list->vid, $_list->vid, $_list->lst_loc_crt_s]); + // $_list->lst_idle_at = count($_query) == 0 ? "" : $_query[0]->lst_idle_at; + + // $_query = "SELECT crt_s as lst_stop_at FROM t_gps_tracks WHERE stts_engine = 0 AND vhc_id = ? AND crt_s >= ( + // SELECT crt_s FROM t_gps_tracks WHERE stts_engine IN (2,1) AND vhc_id = ? AND crt_s <= ? ORDER BY id DESC LIMIT 1 + // ) ORDER BY id ASC LIMIT 1 "; + // $_query = DB::select($_query, [$_list->vid, $_list->vid, $_list->lst_loc_crt_s]); + // $_list->lst_stop_at = count($_query) == 0 ? "" : $_query[0]->lst_stop_at; + + // $_query = + // " SELECT COUNT(id) as lst_heartbeat FROM t_gps_tracks WHERE vhc_id = ? AND action = 'heartbeat' AND crt BETWEEN " . + // ($now - 10 * 60) . + // " AND " . + // $now . + // " LIMIT 1"; + // $_query = DB::select($_query, [$_list->vid]); + // $_list->lst_heartbeat = count($_query) == 0 ? "" : $_query[0]->lst_heartbeat; + // } + // return $list; + // } + public static function listCurrentTracks($filter = []) { $now = time(); $params = []; - $query = "SELECT"; - $query .= - " v.id as vid,v.device_id,v.name as vhc_name,c.name as vhc_cat_name,t.name as vhc_type_name"; - $query .= " ,v.nopol1,v.nopol2,v.nopol3,vd.fvhc_img"; - $query .= " ,v.is_track_holiday,v.track_sch_d,v.track_sch_h,vd.speed_limit,v.crt as vhc_crt"; - $query .= " ,client.id as client_group_id,client.c_name as client_group_name"; - $query .= " ,tr.ignition,tr.stts_engine,tr.stts_gps,tr.stts_gsm"; - $query .= " ,tr.pre_milleage,tr.sum_milleage,tr.vhc_milleage,v.sum_milleage AS vhc_sum_milleage_1"; + $list = DB::select( + " + SELECT + v.id as vid, v.device_id, v.name as vhc_name, + c.name as vhc_cat_name, t.name as vhc_type_name, + v.nopol1, v.nopol2, v.nopol3, vd.fvhc_img, + v.is_track_holiday, v.track_sch_d, v.track_sch_h, + vd.speed_limit, v.crt as vhc_crt, + client.id as client_group_id, client.c_name as client_group_name, + tr.ignition, tr.stts_engine, tr.stts_gps, tr.stts_gsm, + tr.pre_milleage, tr.sum_milleage, tr.vhc_milleage, v.sum_milleage AS vhc_sum_milleage_1, + tr.id AS lst_master_id, tr.latitude AS lst_lat, tr.longitude AS lst_lng, + tr.speed AS lst_speed, tr.orientation AS lst_orientation, + tr.crt AS lst_loc_crt, tr.crt_d AS lst_loc_crt_d, tr.crt_s AS lst_loc_crt_s, + tr_addr.master_id AS lst_addr_master_id, + tr_addr.country_text AS lst_country_text, tr_addr.state_text AS lst_state_text, + tr_addr.city_text AS lst_city_text, tr_addr.district_text AS lst_district_text, + tr_addr.village_text AS lst_village_text, tr_addr.postcode AS lst_postcode, + tr_addr.streets AS lst_streets, tr_addr.fulladdress AS lst_fulladdress + FROM t_vehicles AS v + INNER JOIN t_vehicles_detail AS vd ON v.id = vd.vid + INNER JOIN t_vehicles_types AS t ON v.type_id = t.id + INNER JOIN t_vehicles_cats AS c ON v.cat_id = c.id + LEFT JOIN t_users AS vendor ON v.vendor_id = vendor.id + LEFT JOIN t_clients AS client ON vendor.client_group_id = client.id + LEFT JOIN t_gps_tracks_rltm AS tr ON tr.vhc_id = v.id + LEFT JOIN t_gps_tracks_address AS tr_addr ON tr.latitude = tr_addr.lat AND tr.longitude = tr_addr.lng + WHERE v.dlt IS NULL + AND tr.latitude != 0 AND tr.latitude IS NOT NULL + GROUP BY v.id + ORDER BY tr.crt_d DESC + LIMIT 20 + ", + $params + ); - // FRO - // $query .= " ,(SELECT SUM(pre_milleage) FROM " . self::T_TRACKS . " WHERE vhc_id = v.id LIMIT 1) as vhc_sum_milleage"; - - // $query .= " ,(SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine = " . self::STTS_EN_IDLING . " AND vhc_id = v.id AND crt_s >= ( - // SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine IN (" . self::STTS_EN_STOPING . "," . self::STTS_EN_MOVING . ") AND vhc_id = v.id AND crt_s <= tr.crt_s ORDER BY id DESC LIMIT 1 - // ) ORDER BY id ASC LIMIT 1) as lst_idle_at"; - - // $query .= " ,(SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine = " . self::STTS_EN_STOPING . " AND vhc_id = v.id AND crt_s >= ( - // SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine IN (" . self::STTS_EN_IDLING . "," . self::STTS_EN_MOVING . ") AND vhc_id = v.id AND crt_s <= tr.crt_s ORDER BY id DESC LIMIT 1 - // ) ORDER BY id ASC LIMIT 1) as lst_stop_at"; - - $query .= - " ,tr.id AS lst_master_id,tr.latitude AS lst_lat,tr.longitude AS lst_lng,tr.speed AS lst_speed,tr.orientation AS lst_orientation"; - $query .= " ,tr.crt AS lst_loc_crt,tr.crt_d AS lst_loc_crt_d,tr.crt_s AS lst_loc_crt_s"; - $query .= - " ,tr_addr.master_id AS lst_addr_master_id,tr_addr.country_text AS lst_country_text,tr_addr.state_text AS lst_state_text,tr_addr.city_text AS lst_city_text"; - $query .= - " ,tr_addr.district_text AS lst_district_text,tr_addr.village_text AS lst_village_text,tr_addr.postcode AS lst_postcode"; - $query .= " ,tr_addr.streets AS lst_streets,tr_addr.fulladdress AS lst_fulladdress"; - - // FRO - // $query .= " ,(SELECT COUNT(id) FROM " . self::T_TRACKS . " WHERE vhc_id = v.id AND action = 'heartbeat' AND crt BETWEEN ".($now-(10*60))." AND ".$now." LIMIT 1) as lst_heartbeat"; // heartbeat last data on further 10 minutes - - if (isset($filter["active_rates"])) { - $query .= - ",rate.vdr_id as rate_vdr_id,rate.vhc_type as rate_vhc_type,rate.origin_prov as rate_origin_prov,rate.dest_city as rate_dest_city,rate.dest_district as rate_dest_district"; - $query .= - ",rate.fast_time as rate_fast_time,rate.long_time as rate_long_time,rate.sell_kg as rate_sell_kg,rate.sell_cbm as rate_sell_cbm,rate.sell_ftl as rate_sell_ftl"; - } - if (isset($filter["get_order_data"])) { - $query .= - ",ord.id as ord_id,ord.code as ord_code,ord.status as ord_stts,ord.crt as ord_crt,ord_pck.pck_name as ord_pck_name,ord_pck.pck_addr as ord_pck_addr,ord_drop.drop_name as ord_drop_name,ord_drop.drop_addr as ord_drop_addr"; - $query .= - ",(SELECT nmKotamadyaKel FROM t_region WHERE kodeKab = ord_pck.pck_ktid LIMIT 1) ord_pck_ktname, (SELECT nmKotamadyaKel FROM t_region WHERE kodeKab = ord_drop.drop_ktid LIMIT 1) ord_drop_ktname"; - $query .= - ",ord_drv.drv_name as ord_drv_name,ord_drv.drv_phone_val as ord_drv_phone_val,ord_drv.drv_phone2_val as ord_drv_phone2_val,ord_drv.drv_addr as ord_drv_addr"; - $query .= ",ord_c.c_name as ord_c_name,ord_c.c_pt_name as ord_c_pt_name"; - } - $query .= " FROM t_vehicles AS v"; - $query .= " INNER JOIN t_vehicles_detail AS vd ON v.id = vd.vid"; - $query .= " INNER JOIN t_vehicles_types AS t ON v.type_id = t.id"; - $query .= " INNER JOIN t_vehicles_cats AS c ON v.cat_id = c.id"; - $query .= " LEFT JOIN t_users AS vendor ON v.vendor_id = vendor.id"; - $query .= " LEFT JOIN t_clients AS client ON vendor.client_group_id = client.id"; - // get last updated row from many rows - // $query .= " LEFT JOIN ( SELECT MAX(crt) max_crt, device_id FROM " . self::T_TRACKS . " WHERE latitude is not null AND longitude is not null GROUP BY device_id ORDER BY crt DESC ) AS tr1 ON (v.device_id = tr1.device_id)"; // cara lama berlaku utk gps tracker saja - // // $query .= " LEFT JOIN ( SELECT MAX(crt) max_crt, device_id, vhc_id FROM " . self::T_TRACKS . " WHERE latitude is not null AND longitude is not null GROUP BY vhc_id ORDER BY crt DESC ) AS tr1 ON (v.id = tr1.vhc_id)"; // support gps tracker dan smartphone / apapun yang mempunyai device_id(IMEI) - // $query .= " LEFT JOIN " . self::T_TRACKS . " AS tr ON (tr.crt = tr1.max_crt)"; - // get last updated tracking from updated table realtime - // $query .= " LEFT JOIN db_trucking.t_gps_tracks_rltm AS tr ON tr.vhc_id = v.id"; - $query .= " LEFT JOIN t_gps_tracks_rltm AS tr ON tr.vhc_id = v.id"; - // $query .= " LEFT JOIN " . self::T_TRACKS_ADDR . " AS tr_addr ON tr.id = tr_addr.master_id"; - - //FRO - $query .= - " LEFT JOIN " . - self::T_TRACKS_ADDR . - " AS tr_addr ON tr.latitude = tr_addr.lat and tr.longitude = tr_addr.lng"; - - if (isset($filter["active_rates"])) { - // $query .= " INNER JOIN t_conf_rates as rate ON v.type_id = rate.vhc_type"; - $query .= " INNER JOIN t_conf_rates as rate ON v.vendor_id = rate.vdr_id"; - } - if (isset($filter["get_order_data"])) { - // the old way => only 1 order 1 vehicle - $query .= " LEFT JOIN t_orders as ord ON v.ord_id = ord.id"; - $query .= " LEFT JOIN t_orders_pickups as ord_pck ON v.ord_id = ord_pck.ord_id"; - $query .= " LEFT JOIN t_orders_drops as ord_drop ON v.ord_id = ord_drop.ord_id"; - $query .= " LEFT JOIN t_orders_drivers as ord_drv ON v.ord_id = ord_drv.ord_id"; - $query .= " LEFT JOIN t_orders_clients as ord_c ON v.ord_id = ord_c.ord_id"; - - // the new way => can handle 2 order in 1 vehicle - // $query .= " LEFT JOIN t_orders_vehicles as ord_vhc ON v.id = ord_vhc.vhc_id"; - // $query .= " LEFT JOIN t_orders as ord ON ord_vhc.ord_id = ord.id"; - // $query .= " LEFT JOIN t_orders_pickups as ord_pck ON ord_vhc.ord_id = ord_pck.ord_id"; - // $query .= " LEFT JOIN t_orders_drops as ord_drop ON ord_vhc.ord_id = ord_drop.ord_id"; - // $query .= " LEFT JOIN t_orders_drivers as ord_drv ON ord_vhc.ord_id = ord_drv.ord_id"; - // $query .= " LEFT JOIN t_orders_clients as ord_c ON ord_vhc.ord_id = ord_c.ord_id"; - } - $query .= " WHERE v.dlt is null"; - // $query .= " AND tr.action IN ('location','alarm')"; // kalo gamau ngambil data heartbeat(idling) - // $query .= " AND tr.device_id = v.device_id"; // cara lama berlaku utk gps tracker saja - // $query .= " AND tr.vhc_id = v.id"; // support gps tracker dan smartphone / apapun yang mempunyai device_id(IMEI) // bikin lemot - $query .= " AND tr.latitude != 0 AND tr.latitude is not null"; - if (isset($filter["status"])) { - $query .= " AND v.status = ?"; - $params[] = $filter["status"]; - } - if (isset($filter["is_in_ord"])) { - $query .= " AND v.is_in_ord = ?"; - $params[] = $filter["is_in_ord"]; - } - if (isset($filter["nopol1"]) && isset($filter["nopol2"]) && isset($filter["nopol3"])) { - $query .= " AND v.nopol1 = ? AND v.nopol2 = ? AND v.nopol3 = ?"; - array_push($params, $filter["nopol1"], $filter["nopol2"], $filter["nopol3"]); - } - if (isset($filter["vid"])) { - $query .= " AND v.id = ?"; - $params[] = $filter["vid"]; - } - if (isset($filter["vids"])) { - if ($filter["vids"] && count($filter["vids"]) > 0) { - $binds_vids = ""; - foreach ($filter["vids"] as $k => $v) { - $binds_vids .= "?,"; - $params[] = $v; - } - if (substr($binds_vids, -1) === ",") { - $binds_vids = substr($binds_vids, 0, -1); - } - $query .= " AND v.id IN ($binds_vids)"; - } else { - $query .= " AND v.id = ?"; - $params[] = 0; - } - } - if (isset($filter["own_by_vdr_id"])) { - $query .= " AND v.vendor_id = ?"; - $params[] = $filter["own_by_vdr_id"]; - } - if (isset($filter["active_rates"])) { - // v1 - // $query .= " AND rate.vdr_id != 0 AND rate.dest_city != 0 AND rate.dest_district != 0"; - // $query .= " AND rate.origin_prov = ? AND (rate.dest_city = ? OR rate.dest_district = ?) AND rate.sell_kg = ? AND rate.sell_cbm = ? AND rate.long_time = ?"; - // array_push($params, $filter['active_rates']->origin_prov, $filter['active_rates']->dest_city, $filter['active_rates']->dest_district, $filter['active_rates']->sell_kg, $filter['active_rates']->sell_cbm, $filter['active_rates']->long_time); - // v2 - $query .= - " AND rate.vdr_id != 0 AND rate.dest_city != 0 AND rate.is_active = " . ConfRates::IS_ACTIVE; - $query .= - " AND rate.origin_prov = ? AND (rate.dest_city = ? OR rate.dest_district = ?) AND rate.sell_ftl = ? AND rate.long_time = ?"; - array_push( - $params, - $filter["active_rates"]->origin_prov, - $filter["active_rates"]->dest_city, - $filter["active_rates"]->dest_district, - $filter["active_rates"]->sell_ftl, - $filter["active_rates"]->long_time - ); - } - if (isset($filter["prefer_truck_type"])) { - $query .= " AND v.type_id = ?"; - $params[] = $filter["prefer_truck_type"]; - } - if (isset($filter["get_order_data"])) { - if (isset($filter["client_id"])) { - $query .= " AND ord_c.c_id = ?"; - $params[] = $filter["client_id"]; - } - // $query .= " AND ord.status IN (22,4)"; - } - if (isset($filter["company"])) { - $query .= " AND client.id = ?"; - $params[] = $filter["company"]; - } - - // $query .= " AND v.id = 70"; - - $query .= " GROUP BY v.id"; - $query .= " ORDER BY tr.crt_d DESC"; - $query .= " LIMIT 500;"; - - // dd($query); - - $list = DB::select($query, $params); foreach ($list as $_list) { - $_query = - " SELECT SUM(pre_milleage) as vhc_sum_milleage FROM " . self::T_TRACKS . " WHERE vhc_id = ?"; - $_query = DB::select($_query, [$_list->vid]); - $_list->vhc_sum_milleage = $_query[0]->vhc_sum_milleage; - - $_query = - " - SELECT - crt_s as lst_idle_at - FROM - " . - self::T_TRACKS . - " - WHERE - stts_engine = " . - self::STTS_EN_IDLING . - " - AND vhc_id = ? - AND crt_s >= ( - SELECT - crt_s - FROM - " . - self::T_TRACKS . - " - WHERE - stts_engine IN ( - " . - self::STTS_EN_STOPING . - ", - " . - self::STTS_EN_MOVING . - ") - AND vhc_id = ? - AND crt_s <= ? - ORDER BY - id DESC - LIMIT 1 - ) - ORDER BY - id ASC - LIMIT 1"; - $_query = DB::select($_query, [$_list->vid, $_list->vid, $_list->lst_loc_crt_s]); - $_list->lst_idle_at = count($_query) == 0 ? "" : $_query[0]->lst_idle_at; - - $_query = - "SELECT crt_s as lst_stop_at FROM " . - self::T_TRACKS . - " WHERE stts_engine = " . - self::STTS_EN_STOPING . - " AND vhc_id = ? AND crt_s >= ( - SELECT crt_s FROM " . - self::T_TRACKS . - " WHERE stts_engine IN (" . - self::STTS_EN_IDLING . - "," . - self::STTS_EN_MOVING . - ") AND vhc_id = ? AND crt_s <= ? ORDER BY id DESC LIMIT 1 - ) ORDER BY id ASC LIMIT 1 "; - $_query = DB::select($_query, [$_list->vid, $_list->vid, $_list->lst_loc_crt_s]); - $_list->lst_stop_at = count($_query) == 0 ? "" : $_query[0]->lst_stop_at; - - $_query = - " SELECT COUNT(id) as lst_heartbeat FROM " . - self::T_TRACKS . - " WHERE vhc_id = ? AND action = 'heartbeat' AND crt BETWEEN " . - ($now - 10 * 60) . - " AND " . - $now . - " LIMIT 1"; - $_query = DB::select($_query, [$_list->vid]); - $_list->lst_heartbeat = count($_query) == 0 ? "" : $_query[0]->lst_heartbeat; + $_list->vhc_sum_milleage = self::getVehicleMileage($_list->vid); + $_list->lst_idle_at = self::getIdleAt($_list->vid, $_list->lst_loc_crt_s); + $_list->lst_stop_at = self::getStopAt($_list->vid, $_list->lst_loc_crt_s); + $_list->lst_heartbeat = self::getHeartbeat($_list->vid, $now); } - // em + return $list; } + private static function getVehicleMileage($vhc_id) + { + $res = DB::select("SELECT sum_milleage as vhc_sum_milleage FROM t_vehicles WHERE id = ? LIMIT 1", [ + $vhc_id, + ]); + return $res[0]->vhc_sum_milleage ?? 0; + } + + private static function getIdleAt($vhc_id, $ref_crt_s) + { + $res = DB::select( + " + SELECT crt_s as lst_idle_at + FROM t_gps_tracks + WHERE stts_engine = 2 + AND vhc_id = ? + AND crt_s >= ( + SELECT crt_s FROM t_gps_tracks + WHERE stts_engine IN (0, 1) AND vhc_id = ? AND crt_s <= ? + ORDER BY id DESC LIMIT 1 + ) + ORDER BY id ASC LIMIT 1 + ", + [$vhc_id, $vhc_id, $ref_crt_s] + ); + + return count($res) > 0 ? $res[0]->lst_idle_at : ""; + } + + private static function getStopAt($vhc_id, $ref_crt_s) + { + $res = DB::select( + " + SELECT crt_s as lst_stop_at + FROM t_gps_tracks + WHERE stts_engine = 0 AND vhc_id = ? + AND crt_s >= ( + SELECT crt_s FROM t_gps_tracks + WHERE stts_engine IN (2,1) AND vhc_id = ? AND crt_s <= ? + ORDER BY id DESC LIMIT 1 + ) + ORDER BY id ASC LIMIT 1 + ", + [$vhc_id, $vhc_id, $ref_crt_s] + ); + + return count($res) > 0 ? $res[0]->lst_stop_at : ""; + } + + private static function getHeartbeat($vhc_id, $now) + { + $start = $now - 600; + $res = DB::select( + " + SELECT COUNT(id) as lst_heartbeat + FROM t_gps_tracks + WHERE vhc_id = ? + AND action = 'heartbeat' + AND crt BETWEEN ? AND ? + LIMIT 1 + ", + [$vhc_id, $start, $now] + ); + + return count($res) > 0 ? $res[0]->lst_heartbeat : 0; + } + public static function lastMoveTracks($vid, $filter = []) { $now = time(); diff --git a/app/Models/Tracks_copy.php b/app/Models/Tracks_copy.php index 6da9264..9a9f523 100755 --- a/app/Models/Tracks_copy.php +++ b/app/Models/Tracks_copy.php @@ -63,17 +63,6 @@ class Tracks_copy extends Model $query .= " ,tr.ignition,tr.stts_engine,tr.stts_gps,tr.stts_gsm"; $query .= " ,tr.pre_milleage,tr.sum_milleage,tr.vhc_milleage,v.sum_milleage AS vhc_sum_milleage_1"; - // FRO - // $query .= " ,(SELECT SUM(pre_milleage) FROM " . self::T_TRACKS . " WHERE vhc_id = v.id LIMIT 1) as vhc_sum_milleage"; - - // $query .= " ,(SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine = " . self::STTS_EN_IDLING . " AND vhc_id = v.id AND crt_s >= ( - // SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine IN (" . self::STTS_EN_STOPING . "," . self::STTS_EN_MOVING . ") AND vhc_id = v.id AND crt_s <= tr.crt_s ORDER BY id DESC LIMIT 1 - // ) ORDER BY id ASC LIMIT 1) as lst_idle_at"; - - // $query .= " ,(SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine = " . self::STTS_EN_STOPING . " AND vhc_id = v.id AND crt_s >= ( - // SELECT crt_s FROM " . self::T_TRACKS . " WHERE stts_engine IN (" . self::STTS_EN_IDLING . "," . self::STTS_EN_MOVING . ") AND vhc_id = v.id AND crt_s <= tr.crt_s ORDER BY id DESC LIMIT 1 - // ) ORDER BY id ASC LIMIT 1) as lst_stop_at"; - $query .= " ,tr.id AS lst_master_id,tr.latitude AS lst_lat,tr.longitude AS lst_lng,tr.speed AS lst_speed,tr.orientation AS lst_orientation"; $query .= " ,tr.crt AS lst_loc_crt,tr.crt_d AS lst_loc_crt_d,tr.crt_s AS lst_loc_crt_s"; @@ -83,9 +72,6 @@ class Tracks_copy extends Model " ,tr_addr.district_text AS lst_district_text,tr_addr.village_text AS lst_village_text,tr_addr.postcode AS lst_postcode"; $query .= " ,tr_addr.streets AS lst_streets,tr_addr.fulladdress AS lst_fulladdress"; - // FRO - // $query .= " ,(SELECT COUNT(id) FROM " . self::T_TRACKS . " WHERE vhc_id = v.id AND action = 'heartbeat' AND crt BETWEEN ".($now-(10*60))." AND ".$now." LIMIT 1) as lst_heartbeat"; // heartbeat last data on further 10 minutes - if (isset($filter["active_rates"])) { $query .= ",rate.vdr_id as rate_vdr_id,rate.vhc_type as rate_vhc_type,rate.origin_prov as rate_origin_prov,rate.dest_city as rate_dest_city,rate.dest_district as rate_dest_district"; @@ -107,45 +93,23 @@ class Tracks_copy extends Model $query .= " INNER JOIN t_vehicles_cats AS c ON v.cat_id = c.id"; $query .= " LEFT JOIN t_users AS vendor ON v.vendor_id = vendor.id"; $query .= " LEFT JOIN t_clients AS client ON vendor.client_group_id = client.id"; - // get last updated row from many rows - // $query .= " LEFT JOIN ( SELECT MAX(crt) max_crt, device_id FROM " . self::T_TRACKS . " WHERE latitude is not null AND longitude is not null GROUP BY device_id ORDER BY crt DESC ) AS tr1 ON (v.device_id = tr1.device_id)"; // cara lama berlaku utk gps tracker saja - // // $query .= " LEFT JOIN ( SELECT MAX(crt) max_crt, device_id, vhc_id FROM " . self::T_TRACKS . " WHERE latitude is not null AND longitude is not null GROUP BY vhc_id ORDER BY crt DESC ) AS tr1 ON (v.id = tr1.vhc_id)"; // support gps tracker dan smartphone / apapun yang mempunyai device_id(IMEI) - // $query .= " LEFT JOIN " . self::T_TRACKS . " AS tr ON (tr.crt = tr1.max_crt)"; - // get last updated tracking from updated table realtime - // $query .= " LEFT JOIN db_trucking.t_gps_tracks_rltm AS tr ON tr.vhc_id = v.id"; $query .= " LEFT JOIN t_gps_tracks_rltm AS tr ON tr.vhc_id = v.id"; - // $query .= " LEFT JOIN " . self::T_TRACKS_ADDR . " AS tr_addr ON tr.id = tr_addr.master_id"; - - //FRO $query .= " LEFT JOIN " . self::T_TRACKS_ADDR . " AS tr_addr ON tr.latitude = tr_addr.lat and tr.longitude = tr_addr.lng"; if (isset($filter["active_rates"])) { - // $query .= " INNER JOIN t_conf_rates as rate ON v.type_id = rate.vhc_type"; $query .= " INNER JOIN t_conf_rates as rate ON v.vendor_id = rate.vdr_id"; } if (isset($filter["get_order_data"])) { - // the old way => only 1 order 1 vehicle $query .= " LEFT JOIN t_orders as ord ON v.ord_id = ord.id"; $query .= " LEFT JOIN t_orders_pickups as ord_pck ON v.ord_id = ord_pck.ord_id"; $query .= " LEFT JOIN t_orders_drops as ord_drop ON v.ord_id = ord_drop.ord_id"; $query .= " LEFT JOIN t_orders_drivers as ord_drv ON v.ord_id = ord_drv.ord_id"; $query .= " LEFT JOIN t_orders_clients as ord_c ON v.ord_id = ord_c.ord_id"; - - // the new way => can handle 2 order in 1 vehicle - // $query .= " LEFT JOIN t_orders_vehicles as ord_vhc ON v.id = ord_vhc.vhc_id"; - // $query .= " LEFT JOIN t_orders as ord ON ord_vhc.ord_id = ord.id"; - // $query .= " LEFT JOIN t_orders_pickups as ord_pck ON ord_vhc.ord_id = ord_pck.ord_id"; - // $query .= " LEFT JOIN t_orders_drops as ord_drop ON ord_vhc.ord_id = ord_drop.ord_id"; - // $query .= " LEFT JOIN t_orders_drivers as ord_drv ON ord_vhc.ord_id = ord_drv.ord_id"; - // $query .= " LEFT JOIN t_orders_clients as ord_c ON ord_vhc.ord_id = ord_c.ord_id"; } $query .= " WHERE v.dlt is null"; - // $query .= " AND tr.action IN ('location','alarm')"; // kalo gamau ngambil data heartbeat(idling) - // $query .= " AND tr.device_id = v.device_id"; // cara lama berlaku utk gps tracker saja - // $query .= " AND tr.vhc_id = v.id"; // support gps tracker dan smartphone / apapun yang mempunyai device_id(IMEI) // bikin lemot $query .= " AND tr.latitude != 0 AND tr.latitude is not null"; if (isset($filter["status"])) { $query .= " AND v.status = ?"; @@ -184,11 +148,6 @@ class Tracks_copy extends Model $params[] = $filter["own_by_vdr_id"]; } if (isset($filter["active_rates"])) { - // v1 - // $query .= " AND rate.vdr_id != 0 AND rate.dest_city != 0 AND rate.dest_district != 0"; - // $query .= " AND rate.origin_prov = ? AND (rate.dest_city = ? OR rate.dest_district = ?) AND rate.sell_kg = ? AND rate.sell_cbm = ? AND rate.long_time = ?"; - // array_push($params, $filter['active_rates']->origin_prov, $filter['active_rates']->dest_city, $filter['active_rates']->dest_district, $filter['active_rates']->sell_kg, $filter['active_rates']->sell_cbm, $filter['active_rates']->long_time); - // v2 $query .= " AND rate.vdr_id != 0 AND rate.dest_city != 0 AND rate.is_active = " . ConfRates::IS_ACTIVE; $query .= @@ -211,21 +170,16 @@ class Tracks_copy extends Model $query .= " AND ord_c.c_id = ?"; $params[] = $filter["client_id"]; } - // $query .= " AND ord.status IN (22,4)"; } if (isset($filter["company"])) { $query .= " AND client.id = ?"; $params[] = $filter["company"]; } - // $query .= " AND v.id = 70"; - $query .= " GROUP BY v.id"; $query .= " ORDER BY tr.crt_d DESC"; $query .= " LIMIT 500;"; - // dd($query); - $list = DB::select($query, $params); foreach ($list as $_list) { $_query = @@ -301,7 +255,6 @@ class Tracks_copy extends Model $_query = DB::select($_query, [$_list->vid]); $_list->lst_heartbeat = count($_query) == 0 ? "" : $_query[0]->lst_heartbeat; } - // em return $list; } diff --git a/public/index.php b/public/index.php index 94012d6..b405f91 100755 --- a/public/index.php +++ b/public/index.php @@ -1,5 +1,5 @@ /* .select2-container { - z-index: 99999; - } */ - + z-index: 99999; + } */ @endsection @@ -39,13 +38,11 @@
User Infomation
- +
- +
@@ -53,8 +50,7 @@
- +
@@ -70,15 +66,13 @@
- +
- +
@@ -252,7 +246,7 @@ } $('#btnSubmitUpdtUser').attr('disabed', true); $.ajax({ - url: "{{ route('api_edit_user', '') }}/" + data.uid, + url: "{{ route('api_edit_user_profile', '') }}/" + data.uid, method: 'PUT', crossDomain: true, processData: true, @@ -291,7 +285,7 @@ }) }); }, - removeReadOnly: function () { + removeReadOnly: function() { $('#updt-first_name').removeAttr('readonly'); $('#updt-fulladdress').removeAttr('readonly'); $('#updt-phone').removeAttr('readonly'); @@ -302,7 +296,7 @@ }); $('#btnSubmitUpdtUser').removeClass('d-none'); }, - addReadOnly: function () { + addReadOnly: function() { $('#updt-first_name').attr('readonly', true); $('#updt-fulladdress').attr('readonly', true); $('#updt-phone').attr('readonly', true); diff --git a/resources/views/menu_v1/dashboard.blade.php b/resources/views/menu_v1/dashboard.blade.php index ccfa86b..f9aab50 100755 --- a/resources/views/menu_v1/dashboard.blade.php +++ b/resources/views/menu_v1/dashboard.blade.php @@ -434,6 +434,11 @@ -
+ + + +
+ {{--
@@ -444,15 +449,15 @@ - -
+ --}}
- + {{-- - + --}} @@ -2033,7 +2038,7 @@ }, error: (jqXHR, textStatus, error) => { if (jqXHR.status >= 500) { - Helper.toast('Error', 'just now', 'Cannot get lists trucks'); + Helper.toast('Error', 'just now', 'Cannot get lists vehicles'); } else { Helper.toast('Error', 'just now', jqXHR.responseJSON.meta .message); diff --git a/resources/views/template/navbar.blade.php b/resources/views/template/navbar.blade.php index cbaad61..f1f14ce 100755 --- a/resources/views/template/navbar.blade.php +++ b/resources/views/template/navbar.blade.php @@ -21,13 +21,6 @@ @endcan - @can('transaction.view') - - @endcan @can('zone.view')