diff --git a/app/Http/Controllers/CampController.php b/app/Http/Controllers/CampController.php index 83f48508..c122a258 100644 --- a/app/Http/Controllers/CampController.php +++ b/app/Http/Controllers/CampController.php @@ -17,7 +17,12 @@ class CampController extends Controller public function index(Request $request) { $province = $request->province ?? null; - $blockageDate = $request->blockage_date ?? null; + $city = $request->city ?? null; + $blockageStartDate = $request->blockage_start_date ?? null; + $blockageEndDate = $request->blockage_end_date ?? null; + $blockageDate = $blockageStartDate && $blockageEndDate ? + [$blockageStartDate . ' 00:00:00', $blockageEndDate . ' 23:59:59'] : + null; $axisType = $request->axis_type ?? null; $blockageReason = $request->blockage ?? null; @@ -28,8 +33,11 @@ class CampController extends Controller ->when($province, function ($query, $province) { return $query->where('province_id', $province); }) + ->when($city, function ($query, $city) { + return $query->where('city_id', $city); + }) ->when($blockageDate, function ($query, $blockageDate) { - return $query->whereBetween('submited_at', [$blockageDate . ' 00:00:00', $blockageDate . ' 23:59:59']); + return $query->whereBetween('submited_at', $blockageDate); }) ->when($axisType, function ($query, $axisType) { return $query->where('axis_type', $axisType); @@ -48,6 +56,9 @@ class CampController extends Controller ->when($blockageDate, function ($query, $blockageDate) { return $query->whereBetween('submited_at', [$blockageDate . ' 00:00:00', $blockageDate . ' 23:59:59']); }) + ->when($city, function ($query, $city) { + return $query->where('city_id', $city); + }) ->when($axisType, function ($query, $axisType) { return $query->where('axis_type', $axisType); }) diff --git a/app/Http/Controllers/V3/CMMSMachinesController.php b/app/Http/Controllers/V3/CMMSMachinesController.php index ffba9760..e575d179 100644 --- a/app/Http/Controllers/V3/CMMSMachinesController.php +++ b/app/Http/Controllers/V3/CMMSMachinesController.php @@ -14,7 +14,7 @@ class CMMSMachinesController extends Controller public function list(): JsonResponse { - $machinesList = CMMSMachine::query()->get(['machine_code', 'id']); + $machinesList = CMMSMachine::query()->get(['machine_code', 'id', 'plak_number', 'car_name']); return $this->successResponse($machinesList); } @@ -23,7 +23,7 @@ class CMMSMachinesController extends Controller { $matchedSearchedMachines = CMMSMachine::query() ->where('machine_code', 'LIKE', "%{$request->machine_code}%") - ->get(['machine_code', 'id']); + ->get(['machine_code', 'id', 'plak_number', 'car_name']); return $this->successResponse($matchedSearchedMachines); } diff --git a/app/Http/Controllers/V3/Azmayesh/AzmayeshController.php b/app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshController.php similarity index 95% rename from app/Http/Controllers/V3/Azmayesh/AzmayeshController.php rename to app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshController.php index 83802ce4..72a3bd70 100644 --- a/app/Http/Controllers/V3/Azmayesh/AzmayeshController.php +++ b/app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshController.php @@ -1,9 +1,11 @@ $request->contract_subitem_id ]); + $user->addActivityComplete(1158); + return $this->successResponse(); } @@ -122,6 +124,8 @@ class AzmayeshController extends Controller 'contract_subitem_id' => $request->contract_subitem_id ]); + auth()->user()->addActivityComplete(1159); + return $this->successResponse(); } @@ -133,6 +137,8 @@ class AzmayeshController extends Controller try { $azmayesh->delete(); + auth()->user()->addActivityComplete(1160); + return $this->successResponse(); } catch (QueryException $exception) { diff --git a/app/Http/Controllers/V3/Azmayesh/AzmayeshSampleController.php b/app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshSampleController.php similarity index 96% rename from app/Http/Controllers/V3/Azmayesh/AzmayeshSampleController.php rename to app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshSampleController.php index 703cae75..c5ea04ec 100644 --- a/app/Http/Controllers/V3/Azmayesh/AzmayeshSampleController.php +++ b/app/Http/Controllers/V3/Dashboard/Azmayesh/AzmayeshSampleController.php @@ -1,18 +1,16 @@ azmayeshFields()->attach($fieldsID); + + auth()->user()->addActivityComplete(1162); }); return $this->successResponse(); @@ -100,6 +102,8 @@ class AzmayeshTypeController extends Controller } $azmayeshType->azmayeshFields()->sync($fieldsID); + + auth()->user()->addActivityComplete(1163); }); return $this->successResponse(); @@ -113,6 +117,8 @@ class AzmayeshTypeController extends Controller try { $azmayeshType->delete(); + auth()->user()->addActivityComplete(1164); + return $this->successResponse(); } catch (QueryException $exception) { diff --git a/app/Http/Controllers/V3/Dashboard/ObservedItemController.php b/app/Http/Controllers/V3/Dashboard/ObservedItemController.php new file mode 100644 index 00000000..5018fb5f --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/ObservedItemController.php @@ -0,0 +1,40 @@ +successResponse($observedItem); + } + + public function filter(Request $request): JsonResponse + { + $columns = array( + 'id', 'item_id', 'road_patrol_id', 'roadPatrol.start_time', 'roadPatrol.end_time', + ); + + $allowedFilters = $columns; + $allowedSortings = $columns; + + $data = ObservedItem::query()->whereNull('road_item_id'); + + $dataTable = DataTableFacade::run( + $data, + $request, + allowedFilters: $allowedFilters, + allowedSortings: $allowedSortings + ); + + return response()->json($dataTable); + } +} diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php new file mode 100644 index 00000000..5c0d789c --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadItemsReportController.php @@ -0,0 +1,261 @@ +groupBy('item')->get(); + + return $this->successResponse([ + 'items' => $items, + 'data' => $data, + ]); + } + + public function provinceActivityPerSubItem(Request $request): JsonResponse + { + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $item = $request->item; + + $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + province_id AS p') + ->where('item', '=', $item) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('province_id', 'sub_item') + ->get(); + + $countryRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + -1 AS p') + ->where('item', '=', $item) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('sub_item') + ->get(); + + + $activities = $provinceRoadItemsPerSubItem->push(...$countryRoadItemsPerSubItem); + $provinces = Province::all(['id', 'name_fa']); + $subItems = InfoItem::query() + ->where('item', $item) + ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); + + return $this->successResponse([ + 'activities' => $activities, + 'sub_items' => $subItems, + 'provinces' => $provinces, + ]); + } + + public function cityActivityPerSubItem(Request $request): JsonResponse + { + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $item = $request->item; + $province = $request->province_id; + + $cityRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + province_id AS p, + edarat_id AS ci + ') + ->where('item', '=', $item) + ->where('province_id', '=', $province) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('edarat_id', 'sub_item') + ->get(); + + $provinceRoadItemsPerSubItem = RoadItemsProject::query()->selectRaw(' + sub_item AS t, + COUNT(*) AS c, + CAST(SUM(CASE WHEN sub_item_data > 0 THEN sub_item_data ELSE ABS(sub_item_data) END) AS UNSIGNED) AS s, + province_id AS p, + -1 AS ci + ') + ->where('item', '=', $item) + ->where('province_id', '=', $province) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('status', '=', 1) + ->groupBy('sub_item') + ->get(); + + + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $province)->get(['id', 'name_fa']); + $activities = $cityRoadItemsPerSubItem->push(...$provinceRoadItemsPerSubItem); + $subItems = InfoItem::query() + ->where('item', $item) + ->get(['id', 'item', 'item_str', 'sub_item_str', 'sub_item_unit', 'sub_item']); + + return $this->successResponse([ + 'activities' => $activities, + 'edarateShahri' => $edarateShahri, + 'sub_items' => $subItems, + ]); + } + + public function provinceActivityPerItem(Request $request): JsonResponse + { + if (auth()->check()) { + auth()->user()->addActivityComplete(1033); + } + + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $user = auth()->user(); +// $isSpecialUser = in_array($user->username, ['witel', 'drdanesh']); + $isSpecialUser = $user->hasPermissionTo("show-road-item-supervise-cartable"); + $provinceId = $isSpecialUser ? null : $user->province_id; + + $provinceActivity = RoadItemsProject::query() + ->selectRaw('COUNT(*) AS s, province_id AS p, item AS i') + ->where('status', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }) + ->groupBy('province_id', 'item'); + + $countryActivity = RoadItemsProject::query() + ->selectRaw('COUNT(*) AS s, -1 AS p, item AS i') + ->where('status', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->when(!$isSpecialUser, function ($query) use ($provinceId) { + $query->where('province_id', $provinceId); + }) + ->groupBy('item'); + + $activities = $provinceActivity + ->unionAll($countryActivity) + ->get(); + + $provinces = Province::all(['id', 'name_fa']); + + return $this->successResponse([ + 'activities' => $activities, + 'provinces' => $provinces, + ]); + } + + public function cityActivityPerItem(Request $request): JsonResponse + { + $provinceId = $request->province_id; + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $toDate = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + + $edarehActivity = RoadItemsProject::query() + ->selectRaw(' + COUNT(*) AS s, + edarat_id AS c, + item AS i') + ->where('status', '=', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('province_id', $provinceId) + ->groupBy('item', 'edarat_id'); + + $cityActivity = RoadItemsProject::query() + ->selectRaw(' + COUNT(*) AS s, + -1 AS c, + item AS i') + ->where('status', '=', 1) + ->whereBetween('activity_date_time', [$fromDate, $toDate]) + ->where('province_id', $provinceId) + ->groupBy('item'); + + $activities = $edarehActivity + ->unionAll($cityActivity) + ->get(); + + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']); + + return $this->successResponse([ + 'activities' => $activities, + 'edarateShahri' => $edarateShahri, + ]); + } + + public function map(Request $request): JsonResponse + { + $provinceId = $request->province_id; + $cityId = $request->city_id; + $subId = $request->sub_id; + $item = $request->item; + $dateFrom = $request->date_from ? $request->date_from . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->addDay()->startOfDay()->toDateTimeString(); + + $data = RoadItemsProject::query() + ->where('is_new', '=', 1) + ->when($provinceId, fn($query) => $query->where('province_id', '=', $provinceId)) + ->when($cityId, fn($query) => $query->where('city_id', '=', $cityId)) + ->when($subId, fn($query) => $query->where('sub_items', 'like', '%' . $subId . '%')) + ->when($item, fn($query) => $query->where('item', '=', $item)) + ->when(!is_null($request->status), fn($query) => $query->where('status', '=', $request->status)) + ->whereBetween('activity_date', [$dateFrom, $dateTo]) + ->leftJoin('users', 'users.id', '=', 'road_items_projects.user_id') + ->select('road_items_projects.id as i', 'start_lat as l', 'start_lng as g', 'status') + ->get(); + + return $this->successResponse($data); + } + + public function activityExcelPerItem(Request $request): BinaryFileResponse + { + auth()->user()->addActivityComplete(1034); + $name = 'گزارش از فعالیت روزانه و جاری - جدول 1 ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + return Excel::download(new OneSheet($request->fromDate, $request->toDate, $request->province), $name); + } + + public function activityExcelPerSubItem(Request $request) + { + $url_correction = $request->province ? "&province={$request->province}" : ""; + + return match ($request->type) { + 1 => redirect("/reports/two/maremat?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 2 => redirect("/reports/two/paksazi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 3 => redirect("/reports/two/alaem?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 4 => redirect("/reports/two/hefaz?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 5 => redirect("/reports/two/roshanaei?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 6 => redirect("/reports/two/khatkeshi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 7 => redirect("/reports/two/rangamizi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 8 => redirect("/reports/two/shosteshoo?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 9 => redirect("/reports/two/imensazi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 10 => redirect("/reports/two/harim?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 11 => redirect("/reports/two/pol?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 12 => redirect("/reports/two/toonel?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 13 => redirect("/reports/two/zemestani?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 14 => redirect("/reports/two/mashinalat?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 15 => redirect("/reports/two/rahdar?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 16 => redirect("/reports/two/ezterari?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + 20 => redirect("/reports/two/bazrasi?fromDate={$request->fromDate}&toDate={$request->toDate}" . $url_correction), + default => response()->json([ + 'error' => '404' + ], 404), + }; + } +} diff --git a/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php new file mode 100644 index 00000000..26e218ba --- /dev/null +++ b/app/Http/Controllers/V3/Dashboard/Reports/RoadPatrolReportController.php @@ -0,0 +1,154 @@ +from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + + $activities = DB::select('SELECT + "کشوری" as province_fa, + -1 as province_id, + COUNT(*) tedade, + SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi, + SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori, + SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani, + SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode, + SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode, + ROUND(SUM(distance)) as masafat_tey_shode + FROM (SELECT + province_id, + province_fa, + distance, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode + FROM `road_patrols` rp where rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp + union + SELECT + province_fa, + province_id, + COUNT(*) tedade, + SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi, + SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori, + SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani, + SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode, + SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode, + ROUND(SUM(distance)) as masafat_tey_shode + FROM (SELECT + province_id, + province_fa, + distance, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode + FROM `road_patrols` rp where rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp + GROUP BY province_id' + ); + + $provinces = Province::all(['id', 'name_fa']); + + return $this->successResponse([ + 'activities' => $activities, + 'provinces' => $provinces + ]); + } + + public function cityPatrolActivity(Request $request): JsonResponse + { + $request->validate(["province_id" => "required",]); + $fromDate = $request->from_date ? $request->from_date . ' 00:00:00' : now()->startOfDay()->toDateTimeString(); + $dateTo = $request->date_to ? $request->date_to . ' 23:59:59' : now()->endOfDay()->toDateTimeString(); + $provinceId = $request->province_id; + + $activities = DB::select( + 'SELECT + province_fa, + province_id, + -1 AS edare_id, + "استانی" AS edare_name, + COUNT(*) tedade, + SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi, + SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori, + SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani, + SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode, + SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode, + ROUND(SUM(distance)) as masafat_tey_shode + FROM (SELECT + province_id, + province_fa, + edare_id, + edare_name, + distance, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode + FROM `road_patrols` rp where rp.province_id = "'.$provinceId.'" AND rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp + UNION + SELECT + province_fa, + province_id, + edare_id, + edare_name, + COUNT(*) tedade, + SUM(tedad_mavarede_moshede_shode_adi) as tedad_mavarede_moshede_shode_adi, + SUM(tedad_mavarede_moshede_shode_fori) as tedad_mavarede_moshede_shode_fori, + SUM(tedad_mavarede_moshede_shode_ani) as tedad_mavarede_moshede_shode_ani, + SUM(tedad_mavarede_peygiri_shode) as tedad_mavarede_peygiri_shode, + SUM(tedad_faliyat_sabt_shode) as tedad_faliyat_sabt_shode, + ROUND(SUM(distance)) as masafat_tey_shode + FROM (SELECT + province_id, + province_fa, + edare_id, + edare_name, + distance, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 1) AS tedad_mavarede_moshede_shode_adi, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 2) AS tedad_mavarede_moshede_shode_fori, + (SELECT COUNT(*) FROM `observed_items` oi WHERE rp.`id`= oi.road_patrol_id AND priority = 3) AS tedad_mavarede_moshede_shode_ani, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NOT NULL) AS tedad_mavarede_peygiri_shode, + (SELECT COUNT(*) FROM `observed_items` oii WHERE rp.`id`= oii.road_patrol_id AND oii.road_item_id IS NOT NULL AND priority IS NULL) AS tedad_faliyat_sabt_shode + FROM `road_patrols` rp where rp.province_id = "'.$provinceId.'" AND rp.start_time BETWEEN "'.$fromDate.'" AND "'.$dateTo.'") temp + GROUP BY edare_id + ' + ); + + $edarateShahri = EdarateShahri::query()->where('province_id', '=', $provinceId)->get(['id', 'name_fa']); + + return $this->successResponse([ + 'activities' => $activities, + 'edarateShahri' => $edarateShahri, + ]); + } + + public function excel(Request $request): BinaryFileResponse + { + $name = 'گزارش از گشت راهداری و ترابری ' . verta()->now()->format('Y-m-d H-i') . '.xlsx'; + + return Excel::download( + new RoadPatrolTable($request->from_date, $request->date_to), $name + ); + } +} diff --git a/app/Http/Controllers/V3/RoadItemsProjectController.php b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php similarity index 98% rename from app/Http/Controllers/V3/RoadItemsProjectController.php rename to app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php index 2a84e803..0d9ecc5e 100644 --- a/app/Http/Controllers/V3/RoadItemsProjectController.php +++ b/app/Http/Controllers/V3/Dashboard/RoadItemsProjectController.php @@ -1,6 +1,6 @@ hasPermissionTo('show-road-patrol-supervise-cartable')) { - $query = RoadPatrol::query(); + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']); } elseif ($user->hasPermissionTo('show-road-patrol-supervise-cartable-province')) { if (is_null($user->province_id)) { return $this->errorResponse('استانی برای شما در سامانه ثبت نشده است!'); } - $query = RoadPatrol::query()->where('province_id', '=', $user->province_id); + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) + ->where('province_id', '=', $user->province_id); } $data = DataTableFacade::run( @@ -123,13 +126,15 @@ class RoadPatrolProjectController extends Controller $columns = array( 'id', 'start_lat', 'start_lon', 'end_lat', 'end_lon', 'officer_plaque', 'officer_phone_number', 'officer_name', 'supervisor_description', 'supervising_time', - 'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time' + 'supervisor_name', 'status', 'status_fa', 'distance', 'start_time', 'end_time', 'cmmsMachines.machine_code' ); $allowedFilters = $columns; $allowedSortings = $columns; - $query = RoadPatrol::query()->where('operator_id', '=', auth()->user()->id); + $query = RoadPatrol::query() + ->with(['rahdaran:id,name,code', 'cmmsMachines:id,machine_code,car_name,plak_number']) + ->where('operator_id', '=', auth()->user()->id); $data = DataTableFacade::run( $query, @@ -140,7 +145,7 @@ class RoadPatrolProjectController extends Controller return response()->json($data); } - public function store(StoreRequest $request, NominatimService $nominatimService) + public function store(StoreRequest $request, NominatimService $nominatimService): JsonResponse { $user = auth()->user(); @@ -156,24 +161,13 @@ class RoadPatrolProjectController extends Controller ], 400); } - $start_coordinates = explode(',', $request->start_point); - $end_coordinates = explode(',', $request->end_point); - $edare_id = $user->edarate_shahri_id ?? $user->edarate_ostani_id; $edare_name = $user->edarate_shahri_id ? $user->edarate_shahri_name : $user->edarate_ostani_name; - $road_patrol = DB::transaction(function () use ($request, $start_coordinates, - $end_coordinates, $edare_id, + $road_patrol = DB::transaction(function () use ($request, $edare_id, $edare_name, $nominatimService, $user) { $road_patrol = RoadPatrol::query()->create([ - 'start_lat' => $start_coordinates[0], - 'start_lon' => $start_coordinates[1], - 'end_lat' => $end_coordinates[0], - 'end_lon' => $end_coordinates[1], - 'officer_name' => $request->officer_name, - 'officer_phone_number' => $request->officer_phone_number, - 'officer_plaque' => $request->officer_plaque, 'operator_id' => $user->id, 'operator_name' => $user->name, 'province_id' => $user->province_id, @@ -182,16 +176,20 @@ class RoadPatrolProjectController extends Controller 'city_fa' => $user->city_fa, 'edare_id' => $edare_id, 'edare_name' => $edare_name, - 'start_way_id' => $nominatimService->get_way_id_from_nominatim($start_coordinates[0], $start_coordinates[1]), - 'end_way_id' => $nominatimService->get_way_id_from_nominatim($end_coordinates[0], $end_coordinates[1]), 'status' => 0, 'status_fa' => 'در حال بررسی', 'distance' => $request->distance, 'start_time' => $request->start_time, 'end_time' => $request->end_time, 'description' => $request->description ?? null, + 'fuel_consumption' => $request->fuel_consumption, + 'vehicle_runtime' => $request->vehicle_runtime, + 'stop_points' => json_encode($request->stop_points), ]); + $road_patrol->rahdaran()->attach($request->road_patrol_rahdaran_id); + $road_patrol->cmmsMachines()->attach($request->road_patrol_machines_id); + if ($request->observed_items) { foreach ($request->observed_items as $index => $item) { $info_item = InfoItem::where('item', $item['item_id']) @@ -285,6 +283,9 @@ class RoadPatrolProjectController extends Controller 'message' => 'اقدام مربوطه قبلا رسیدگی شده است.' ], 400); } + + $road_item->rahdaran()->attach($item['road_item_rahdaran_id']); + $road_item->cmmsMachines()->attach($item['road_item_machines_id']); } } } @@ -297,10 +298,7 @@ class RoadPatrolProjectController extends Controller return $road_patrol; }); - return response()->json([ - 'road_patrol_id' => $road_patrol->id, - 'message' => 'succussful' - ]); + return $this->successResponse(); } public function getReport(RoadPatrol $roadPatrol): JsonResponse diff --git a/app/Http/Controllers/V3/FMSVehicleManagementController.php b/app/Http/Controllers/V3/FMSVehicleManagementController.php new file mode 100644 index 00000000..898ede9d --- /dev/null +++ b/app/Http/Controllers/V3/FMSVehicleManagementController.php @@ -0,0 +1,30 @@ +setInputParameters([ + "machineCode" => $request->machineCode, + "startDT" => $request->startDT, + "endDT" => $request->endDT, + ]); + + $data = $getVehicleActivityService->run(); + return $this->successResponse($data); + } +} diff --git a/app/Http/Controllers/V3/ProfileController.php b/app/Http/Controllers/V3/ProfileController.php index b5841811..008ec6e7 100644 --- a/app/Http/Controllers/V3/ProfileController.php +++ b/app/Http/Controllers/V3/ProfileController.php @@ -30,6 +30,7 @@ class ProfileController extends Controller 'major' => $user->major, 'degree' => $user->degree, 'mobile' => $user->mobile, + 'province_id' => $user->province_id, 'avatar' => $user->avatarUrl() ]); } @@ -81,7 +82,7 @@ class ProfileController extends Controller public function addActivity(Request $request): JsonResponse { - auth()->user()->addActivityComplete($request->query('activityCode')); + auth()->user()->addActivityComplete($request->activityCode); return $this->successResponse(); } } diff --git a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php index 9dbd916a..b0986e4b 100644 --- a/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php +++ b/app/Http/Requests/V3/RoadPatrolProject/StoreRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\V3\RoadPatrolProject; +use App\Rules\VerificationCode; use Illuminate\Foundation\Http\FormRequest; class StoreRequest extends FormRequest @@ -11,7 +12,7 @@ class StoreRequest extends FormRequest */ public function authorize(): bool { - return false; + return true; } /** @@ -22,14 +23,17 @@ class StoreRequest extends FormRequest public function rules(): array { return [ - 'start_point' => 'required', - 'end_point' => 'required', + 'verification_code' => ['required', 'string', new VerificationCode($this->phone_number)], 'distance' => 'numeric', - 'officer_name' => 'required', - 'officer_plaque' => 'required', - 'officer_phone_number' => 'required|digits:11', 'start_time' => 'required|date_format:Y-m-d H:i', 'end_time' => 'required|date_format:Y-m-d H:i|after:start_time', + 'fuel_consumption' => 'required|integer', + 'vehicle_runtime' => 'required|integer', + 'stop_points' => 'required|array', + 'road_patrol_machines_id' => 'required|array', + 'road_patrol_machines_id.*' => 'required|exists:cmms_machines,id', + 'road_patrol_rahdaran_id' => 'required|array', + 'road_patrol_rahdaran_id.*' => 'required|exists:rahdaran,id', 'observed_items' => 'array', 'observed_items.*.item_id' => 'required|integer', @@ -41,13 +45,23 @@ class StoreRequest extends FormRequest // road item projects fields 'observed_items.*.start_point' => 'required', 'observed_items.*.end_point' => '', - 'observed_items.*.amount' => 'numeric|required_if:instant_action,1', + 'observed_items.*.amount' => 'numeric|required_if:observed_items.*.instant_action,1', 'observed_items.*.before_image' => 'image|max:4096', 'observed_items.*.after_image' => 'image|max:4096', - 'observed_items.*.priority' => 'integer|in:1,2,3|required_if:instant_action,0', - 'observed_items.*.priority_fa' => 'string|required_if:instant_action,0', + 'observed_items.*.priority' => 'integer|in:1,2,3|required_if:observed_items.*.instant_action,0', + 'observed_items.*.priority_fa' => 'string|required_if:observed_items.*.instant_action,0', 'description' => 'string|required_with:observed_items', + 'observed_items.*.road_item_machines_id' => 'required_if:observed_items.*.instant_action,1|array', + 'observed_items.*.road_item_machines_id.*' => 'required_if:observed_items.*.instant_action,1|exists:cmms_machines,id', + 'observed_items.*.road_item_rahdaran_id' => 'required_if:observed_items.*.instant_action,1|array', + 'observed_items.*.road_item_rahdaran_id.*' => 'required_if:observed_items.*.instant_action,1|exists:rahdaran,id', + ]; + } + + public function attributes(): array + { + return [ 'start_time' => 'ساعت شروع گشت', 'end_time' => 'ساعت پایان گشت', ]; diff --git a/app/Models/RoadPatrol.php b/app/Models/RoadPatrol.php index d439e2d8..c39af8c2 100644 --- a/app/Models/RoadPatrol.php +++ b/app/Models/RoadPatrol.php @@ -4,6 +4,8 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\MorphToMany; class RoadPatrol extends Model { @@ -11,8 +13,28 @@ class RoadPatrol extends Model protected $guarded = ['id']; - public function observedItems() + public function observedItems(): HasMany { return $this->hasMany(ObservedItem::class); } + + public function cmmsMachines(): MorphToMany + { + return $this->morphToMany(CMMSMachine::class, + 'machinable', + 'machinables', + 'machinable_id', + 'machine_id' + ); + } + + public function rahdaran(): MorphToMany + { + return $this->morphToMany(Rahdaran::class, + 'rahdarable', + 'rahdarables', + 'rahdarable_id', + 'rahdar_id', + ); + } } diff --git a/app/Rules/VerificationCode.php b/app/Rules/VerificationCode.php new file mode 100644 index 00000000..fedeb0c5 --- /dev/null +++ b/app/Rules/VerificationCode.php @@ -0,0 +1,27 @@ +phone_number, $value); + + if (!$verified) { + $fail('The :attribute is not valid.')->translate(); + } + } +} diff --git a/app/Services/FMS/GetVehicleActivityService.php b/app/Services/FMS/GetVehicleActivityService.php index 94f124eb..e7b6dd28 100644 --- a/app/Services/FMS/GetVehicleActivityService.php +++ b/app/Services/FMS/GetVehicleActivityService.php @@ -63,6 +63,7 @@ class GetVehicleActivityService $inputData = $this->inputParameters + array( "username" => $this->username, "password" => $this->password, + "minStopDuration" => 1, ); return json_encode($inputData); diff --git a/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php b/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php new file mode 100644 index 00000000..9dcd85bc --- /dev/null +++ b/database/migrations/2024_12_31_133123_add_column_to_road_patrols_table.php @@ -0,0 +1,40 @@ +double('start_lat', null, 0)->nullable()->change(); + $table->double('start_lon', null, 0)->nullable()->change(); + $table->double('end_lat', null, 0)->nullable()->change(); + $table->double('end_lon', null, 0)->nullable()->change(); + $table->integer('fuel_consumption')->nullable(); + $table->integer('vehicle_runtime')->nullable(); + $table->json('stop_points')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('road_patrols', function (Blueprint $table) { + $table->double('start_lat', null, 0)->change(); + $table->double('start_lon', null, 0)->change(); + $table->double('end_lat', null, 0)->change(); + $table->double('end_lon', null, 0)->change(); + $table->dropColumn('fuel_consumption'); + $table->dropColumn('vehicle_runtime'); + $table->dropColumn('stop_points'); + }); + } +}; diff --git a/routes/v3.php b/routes/v3.php index 46e28e75..78e8be34 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -1,15 +1,19 @@ name('harim')->group(function () { @@ -170,3 +174,39 @@ Route::prefix('rahdaran') Route::get('/list', 'list')->name('list'); Route::get('/search', 'search')->name('search'); }); + +Route::prefix('fms_vehicle') + ->name('fmsVehicle.') + ->controller(FMSVehicleManagementController::class) + ->group(function () { + Route::post('/get_activity', 'getActivity')->name('getActivity'); + }); + +Route::prefix('observed_items') + ->name('observedItem.') + ->controller(ObservedItemController::class) + ->group(function () { + Route::get('/filter', 'filter')->name('filter'); + Route::get('/{observedItem}', 'show')->name('show'); + }); + +Route::prefix('road_item_reports') + ->name('roadItemReports.') + ->controller(RoadItemsReportController::class) + ->group(function () { + Route::get('/get_sub_items', 'getSubItems')->name('getSubItems'); + Route::get('/province_activity_per_sub_item', 'provinceActivityPerSubItem')->name('provinceActivityPerSubItem'); + Route::get('/city_activity_per_sub_item', 'cityActivityPerSubItem')->name('cityActivityPerSubItem'); + Route::get('/province_activity_per_item', 'provinceActivityPerItem')->name('provinceActivityPerItem'); + Route::get('/city_activity_per_item', 'cityActivityPerItem')->name('cityActivityPerItem'); + Route::get('/map', 'map')->name('map'); + }); + +Route::prefix('road_patrol_reports') + ->name('roadPatrolReports.') + ->controller(RoadPatrolReportController::class) + ->group(function () { + Route::get('/province_activity', 'provincePatrolActivity')->name('provincePatrolActivity'); + Route::get('/city_activity', 'cityPatrolActivity')->name('cityPatrolActivity'); + Route::get('/excel', 'excel')->name('excel'); + }); diff --git a/storage/sql-files/edarate_shahri.sql b/storage/sql-files/edarate_shahri.sql index b61474b3..85a2b042 100644 --- a/storage/sql-files/edarate_shahri.sql +++ b/storage/sql-files/edarate_shahri.sql @@ -520,3 +520,4 @@ INSERT INTO edarate_shahri (name_fa,province_id,created_at,updated_at) VALUES ('اداره خمام',28,'2023-06-17 08:43:14','2023-06-17 08:43:14'), ('اداره اصلاندوز',3,'2023-08-15 09:33:55','2023-08-15 09:33:55'); ('اداره گالیکش',27,'2024-11-16 14:33:55','2024-11-16 14:33:55'); + ('آزادراه ساوه-تهران',32,'2025-01-06 14:33:55','2025-01-06 14:33:55'); diff --git a/storage/sql-files/log_lists.sql b/storage/sql-files/log_lists.sql index 97afa167..914b9823 100644 --- a/storage/sql-files/log_lists.sql +++ b/storage/sql-files/log_lists.sql @@ -149,3 +149,15 @@ INSERT INTO log_lists (description,log_unique_code,action_type,is_done) VALUES ('ثبت فعالیت روزانه','1154','action',0), ('حذف نگهداری و حریم','1155','action',0), ('ورود به نقشه نگهداری حریم','1156','show',1); +INSERT INTO log_lists (description,log_unique_code,action_type,is_done) VALUES + ('ورود به کارتابل آزمایشات','1157','action',0), + ('ثبت آزمایش','1158','action',0), + ('ویرایش آزمایش','1159','action',0), + ('حذف آزمایش','1160','action',0), + ('ورود به کارتابل نوع آزمایشات','1161','action',0), + ('ثبت نوع آزمایش','1162','action',0), + ('ویرایش نوع آزمایش','1163','action',0), + ('حذف نوع آزمایش','1164','action',0), + ('ثبت نمونه آزمایش','1165','action',0), + ('ویرایش نمونه آزمایش','1166','action',0), + ('حذف نمونه آزمایش','1167','action',0),