krgm.so-manager-dev.com/app/Http/Controllers/Admin/UsingStatusController.php

232 lines
8.6 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Services\UsingStatusService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
/**
* 区画別利用率状況コントローラー
* Laravel 12対応旧Laravel 5.7からの移行版
*
* 機能:駐輪場の利用率統計表示とフィルタリング
* URL/using_status
*/
class UsingStatusController extends Controller
{
/**
* コントローラーのインスタンス作成
* Laravel 12変更点ミドルウェアは routes/web.php で処理するように変更
*
* @return void
*/
public function __construct()
{
// Laravel 12: ミドルウェアは routes/web.php で処理
// Laravel 5.7: $this->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 {
// CSRF トークンの自動検証Laravel 12標準機能
// リクエストパラメータの取得
// Laravel 12変更点$request->input()の使用を推奨
$parkId = $request->input('park_id', null);
$isSearchRequest = $request->has('search') || $request->isMethod('post');
// ログ出力(デバッグ用)
Log::info('区画別利用率状況ページアクセス', [
'park_id' => $parkId,
'is_search' => $isSearchRequest,
'method' => $request->method()
]);
// 駐輪場一覧の取得(選択用ドロップダウン)
$parkList = $service->getParkList();
// 利用率統計データの取得
// Laravel 12変更点デフォルトで全データを表示ユーザー選択不要
$utilizationStats = $service->getUtilizationStats($parkId);
// データが空の場合の処理
if ($utilizationStats->isEmpty() && $parkId) {
// 指定された駐輪場のデータが見つからない場合
return redirect()->route('using_status')
->with('warning', '選択された駐輪場のデータが見つかりませんでした。');
}
// 検索要求でない場合は全データを表示
if (!$isSearchRequest && !$parkId) {
$utilizationStats = $service->getUtilizationStats(null);
}
// 合計値の計算
$totals = $service->calculateTotals($utilizationStats);
// 選択された駐輪場の情報
$selectedPark = null;
if ($parkId && $parkList->isNotEmpty()) {
$selectedPark = $parkList->firstWhere('park_id', $parkId);
}
// ビューに渡すデータの準備
$viewData = [
'parkList' => $parkList, // 駐輪場選択用リスト
'utilizationStats' => $utilizationStats, // 利用率統計データ
'totals' => $totals, // 合計値
'selectedParkId' => $parkId, // 選択された駐輪場ID
'selectedPark' => $selectedPark, // 選択された駐輪場情報
'isSearchRequest' => $isSearchRequest, // 検索リクエストかどうか
'hasData' => $utilizationStats->isNotEmpty() // データが存在するかどうか
];
// 成功メッセージの設定(検索時)
if ($isSearchRequest && $utilizationStats->isNotEmpty()) {
session()->flash('success', '利用率データを正常に取得しました。');
}
return view('admin.using_status.index', $viewData);
} 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->ptype_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 に委譲(本メソッドは撤去)
}