192 lines
6.7 KiB
PHP
192 lines
6.7 KiB
PHP
<?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 {
|
||
$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->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 に委譲(本メソッドは撤去)
|
||
} |