middleware('auth'); を使用していた } /** * 区画別利用率状況ページの表示 * Laravel 12変更点:Request処理の最適化、エラーハンドリングの強化 * * @param \Illuminate\Http\Request $request * @return \Illuminate\View\View|\Illuminate\Http\RedirectResponse */ public function index(Request $request, UsingStatusService $service) { try { $parkId = $request->input('park_id'); // GET/POST どちらでも取得 $parkList = $service->getParkList(); // 駐輪場が選択されている場合のみ取得。「全て/空」の場合は空コレクションを返す $utilizationStats = collect(); if ($parkId !== null && $parkId !== '') { $utilizationStats = $service->getUtilizationStats($parkId); } $totals = $service->calculateTotals($utilizationStats); $hasData = $utilizationStats->isNotEmpty(); $isSearchRequest = ($request->isMethod('post') || $request->has('park_id')); $selectedPark = $parkList->firstWhere('park_id', $parkId); return view('admin.using_status.index', [ 'parkList' => $parkList, 'utilizationStats' => $utilizationStats, 'totals' => $totals, 'selectedParkId' => $parkId, 'selectedPark' => $selectedPark, 'isSearchRequest' => $isSearchRequest, 'hasData' => $hasData, ]); } catch (\Exception $e) { Log::error('区画別利用率状況ページエラー', [ 'error' => $e->getMessage(), 'file' => $e->getFile(), 'line' => $e->getLine(), 'park_id' => $parkId ?? null, ]); return redirect()->route('using_status') ->with('error', 'データの取得中にエラーが発生しました。管理者にお問い合わせください。'); } } /** * 駐輪場一覧の取得 * Laravel 12変更点:プライベートメソッドでの処理分離 * * @return \Illuminate\Support\Collection */ // 旧: Helper 直呼びはサービス化により撤去 /** * 利用率統計データの取得 * Laravel 12変更点:エラーハンドリングの強化 * * @param int|null $parkId 駐輪場ID * @return \Illuminate\Support\Collection */ // 旧: Helper 直呼びはサービス化により撤去 /** * 合計値の計算 * Laravel 12変更点:計算ロジックの分離 * * @param \Illuminate\Support\Collection $stats 統計データ * @return array */ // 旧: Helper 直呼びはサービス化により撤去 /** * Ajax用API(将来拡張用) * Laravel 12対応:JSON APIレスポンス * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\JsonResponse */ public function apiGetUtilization(Request $request, UsingStatusService $service) { try { $parkId = $request->input('park_id'); // データ取得 $stats = $service->getUtilizationStats($parkId); $totals = $service->calculateTotals($stats); return response()->json([ 'success' => true, 'data' => $stats, 'totals' => $totals, 'message' => 'データを正常に取得しました。' ]); } catch (\Exception $e) { Log::error('API利用率取得エラー', [ 'error' => $e->getMessage() ]); return response()->json([ 'success' => false, 'message' => 'データの取得に失敗しました。', 'error' => app()->isProduction() ? null : $e->getMessage() ], 500); } } /** * データエクスポート(将来拡張用) * Laravel 12対応:CSVエクスポート機能 * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function exportCsv(Request $request, UsingStatusService $service, \App\Services\CsvService $csv) { try { $parkId = $request->input('park_id'); $stats = $service->getUtilizationStats($parkId); $headers = [ 'Content-Type' => 'text/csv; charset=UTF-8', 'Content-Disposition' => 'attachment; filename="利用率状況_' . date('Y-m-d_H-i-s') . '.csv"' ]; // サービスでCSV文字列を構築 $rows = []; // ヘッダー $rows[] = ['駐輪場', '車種', '限界収容台数', '現在収容台数', '空き', '利用率']; foreach ($stats as $stat) { $rows[] = [ (string) $stat->park_name, (string) $stat->psection_subject, (string) $stat->park_limit, (string) $stat->current_count, (string) $stat->available, sprintf('%.1f%%', (float) $stat->usage_rate), ]; } $csvData = $csv->buildCsvString($rows, ','); return response($csvData, 200, $headers); } catch (\Exception $e) { Log::error('CSVエクスポートエラー', [ 'error' => $e->getMessage() ]); return redirect()->route('using_status') ->with('error', 'CSVエクスポートに失敗しました。'); } } /** * CSVデータの生成(プライベートメソッド) * Laravel 12変更点:文字エンコーディングの考慮 * * @param \Illuminate\Support\Collection $stats * @return string */ // CSV 生成は CsvService に委譲(本メソッドは撤去) }