From 971d6fd3ddae338f6dc3afd9ee5f638d05f79218 Mon Sep 17 00:00:00 2001 From: faezehzafarbakhsh Date: Mon, 29 Dec 2025 13:21:10 +0330 Subject: [PATCH] create report service and use in cintroller --- .../V3/Dashboard/Mission/ReportController.php | 40 ++++------ .../Cartables/Mission/ReportService.php | 73 +++++++++++++++++-- routes/v3.php | 6 +- 3 files changed, 85 insertions(+), 34 deletions(-) diff --git a/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php b/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php index 6685b30c..8b3e6dc4 100644 --- a/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php +++ b/app/Http/Controllers/V3/Dashboard/Mission/ReportController.php @@ -4,7 +4,7 @@ namespace App\Http\Controllers\V3\Dashboard\Mission; use App\Http\Controllers\Controller; use App\Http\Traits\ApiResponse; -use App\Models\Mission; +use App\Models\City; use App\Models\Province; use App\Services\Cartables\Mission\ReportService; use Illuminate\Http\JsonResponse; @@ -14,45 +14,35 @@ class ReportController extends Controller { use ApiResponse; - public function countryActivity(Request $request, ReportService $reportrService): JsonResponse + public function countryActivity(Request $request, ReportService $reportService): JsonResponse { - return $this->successResponse([ - 'activities' => $reportrService->countryActivity($request), + 'activities' => $reportService->countryActivity($request), 'provinces' => Province::all(['id', 'name_fa']), ]); } -// public function provinceActivity(Request $request, OperatorService $operatorService): JsonResponse -// { -// -// $data = $operatorService->provinceActivity( -// $request, -// 90, -// ); -// -// return $this->successResponse([ -// 'activities' => $data, -// 'edarateShahri' => EdarateShahri::where('province_id', $request->province_id)->get(['id', 'name_fa']), -// ]); -// } + public function provinceActivity(Request $request, ReportService $reportService): JsonResponse + { + return $this->successResponse([ + 'activities' =>$reportService->provinceActivity($request), + 'city' => City::query()->where('province_id', $request->province_id)->get(['id', 'name_fa']), + ]); + } // // public function countryExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse // { -// $data = $operatorService->countryActivity(90, $request); -// $name = 'گزارش نگهداری حریم راه برای راه دسترسی غیر مجاز '.verta()->now()->format('Y-m-d H-i').'.xlsx'; +// $data = $operatorService->countryActivity($request); +// $name = 'گزارش تخلفات ماموریت ها '.verta()->now()->format('Y-m-d H-i').'.xlsx'; // // return Excel::download(new ExcelReport($data), $name); // } // // public function provinceExcelActivity(Request $request, OperatorService $operatorService): BinaryFileResponse // { -// $data = $operatorService->provinceActivity( -// $request, -// 90, -// ); -// $name = 'گزارش نگهداری حریم راه برای راه دسترسی غیر مجاز '.verta()->now()->format('Y-m-d H-i').'.xlsx'; +// $data = $operatorService->provinceActivity($request); +// $name = 'گزارش تخلفات ماموریت ها '.verta()->now()->format('Y-m-d H-i').'.xlsx'; // -// return Excel::download(new AccessRoadReport($data, $request), $name); +// return Excel::download(new ProvinceExcelReport($data, $request), $name); // } } diff --git a/app/Services/Cartables/Mission/ReportService.php b/app/Services/Cartables/Mission/ReportService.php index d0ce7757..8e3dd647 100644 --- a/app/Services/Cartables/Mission/ReportService.php +++ b/app/Services/Cartables/Mission/ReportService.php @@ -14,8 +14,6 @@ class ReportService { $user = auth()->user(); - throw_if(is_null($user->edarate_shahri_id), new ProhibitedAction('اداره ای برای شما در سامانه ثبت نشده است!')); - $query = Mission::query()->where('edare_shahri_id', '=', $user->edarate_shahri_id); return DataTableFacade::run( @@ -34,7 +32,7 @@ class ReportService $sql = " WITH r AS ( SELECT - p.id, + p.id AS province_id, p.name_fa AS province_name, COUNT(DISTINCT CASE @@ -70,7 +68,7 @@ class ReportService UNION ALL SELECT - province_name, no_mission_count, out_of_area_count + province_id, province_name, no_mission_count, out_of_area_count FROM r ORDER BY @@ -85,9 +83,70 @@ class ReportService 'to_m' => $to, ]); } - - public function provinceActivity(Request $request, int $info_id) + public function provinceActivity(Request $request): array { - // + $provinceId = $request->province_id ?? auth()->user()->province_id; + $from = $request->from_date ?? today()->startOfDay(); + $to = $request->to_date ?? today()->endOfDay(); + + $sql = " + WITH r AS ( + SELECT + c.id AS city_id, + c.name_fa AS city_name, + + COUNT(DISTINCT CASE + WHEN mv.type = 1 + AND mv.created_at BETWEEN :from_mv AND :to_mv + THEN mv.id + END) AS no_mission_count, + + COUNT(DISTINCT CASE + WHEN m.mission_duration != m.in_area_duration + AND m.created_at BETWEEN :from_m AND :to_m + THEN m.id + END) AS out_of_area_count + + FROM cities c + + LEFT JOIN cmms_machines cm + ON cm.city_id = c.id + + LEFT JOIN mission_violations mv + ON TRIM(cm.machine_code) = TRIM(mv.machine_code) + + LEFT JOIN missions m + ON m.city_id = c.id + + WHERE c.province_id = :province_id + + GROUP BY c.id, c.name_fa + ) + + SELECT + -1 AS city_id, + 'کل استان' AS city_name, + SUM(no_mission_count) AS no_mission_count, + SUM(out_of_area_count) AS out_of_area_count + FROM r + + UNION ALL + + SELECT + city_id, city_name, no_mission_count, out_of_area_count + FROM r + + ORDER BY + CASE WHEN city_id = -1 THEN 0 ELSE 1 END, + city_name + "; + + return DB::select($sql, [ + 'province_id' => $provinceId, + 'from_mv' => $from, + 'to_mv' => $to, + 'from_m' => $from, + 'to_m' => $to, + ]); } } \ No newline at end of file diff --git a/routes/v3.php b/routes/v3.php index a51379db..d627201f 100644 --- a/routes/v3.php +++ b/routes/v3.php @@ -537,8 +537,10 @@ Route::prefix('missions') ->name('reports.') ->controller(\App\Http\Controllers\V3\Dashboard\Mission\ReportController::class) ->group(function () { - Route::get('/country_activity', 'countryActivity')->name('countryActivity'); - Route::get('/province_activity', 'provinceActivity')->name('provinceActivity'); + Route::get('/country_activity', 'countryActivity')->name('countryActivity') + ->middleware('permission:mission-report-country'); + Route::get('/province_activity', 'provinceActivity')->name('provinceActivity') + ->middleware('permission:mission-report-province'); Route::get('/country_excel_activity', 'countryExcelActivity')->name('countryExcelActivity'); Route::get('/province_excel_activity', 'provinceExcelActivity')->name('provinceExcelActivity'); });