krgm.so-manager-dev.com/app/Http/Controllers/Admin/UsingStatusController.php
你的名字 2abeb50a50
All checks were successful
Deploy main / deploy (push) Successful in 23s
【指摘対応】
2025-10-10 16:28:29 +09:00

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