From 4fa9a8a297b21fd341c7aef1b2ceb44595cd94cd Mon Sep 17 00:00:00 2001 From: "OU.ZAIKOU" Date: Thu, 5 Feb 2026 11:26:52 +0900 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E6=88=BB=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Admin/CityController.php | 97 ++++- resources/views/layouts/app.blade.php | 332 ++++++++++-------- routes/web.php | 108 ++---- 3 files changed, 290 insertions(+), 247 deletions(-) diff --git a/app/Http/Controllers/Admin/CityController.php b/app/Http/Controllers/Admin/CityController.php index 55cba28..4b74717 100644 --- a/app/Http/Controllers/Admin/CityController.php +++ b/app/Http/Controllers/Admin/CityController.php @@ -1,47 +1,53 @@ input('sort', 'city_id'); - $sortType = (string) $request->input('sort_type', 'asc'); - $page = (int) $request->get('page', 1); + $sort = $request->input('sort', 'city_id'); + $sortType = $request->input('sort_type', 'asc'); + $page = $request->get('page', 1); + $menuAccessService = app(\App\Services\MenuAccessService::class); + + // メニューアクセス制御: 非ソーリンユーザーは所属自治体のみ表示 $query = City::query(); + if (!$menuAccessService->isSorin()) { + $operator = auth()->user(); + if ($operator && isset($operator->management_id)) { + $query->where('management_id', $operator->management_id); + } + } if ($request->filled('city_name')) { $query->where('city_name', 'like', '%' . $request->input('city_name') . '%'); } - // 排序处理 + // ソート処理 if (!empty($sort)) { $query->orderBy($sort, $sortType); } $list = $query->paginate(20); - // 页码越界处理 + // インデックス超過処理 if ($list->total() > 0 && $page > $list->lastPage()) { - return redirect()->route('cities.index', [ + return redirect()->route('city', [ 'sort' => $sort, 'sort_type' => $sortType, ]); } - return view('admin.cities.index', [ + return view('admin.CityMaster.list', [ + 'isMethodPost' => $request->isMethod('post'), 'sort' => $sort, 'sort_type' => $sortType, 'list' => $list, @@ -49,7 +55,7 @@ final class CityController extends Controller ]); } - public function create(): View + public function add(Request $request) { $inputs = [ 'city_name' => '', @@ -112,6 +118,12 @@ final class CityController extends Controller abort(404); } + // メニューアクセス制御確認 + $menuAccessService = app(\App\Services\MenuAccessService::class); + if (!$menuAccessService->canAccessCity($city->city_id)) { + abort(403, 'この自治体へのアクセス権限がありません。'); + } + if ($request->isMethod('POST')) { $rules = [ 'city_name' => ['required', 'string', 'max:10', 'regex:/^[^ -~。-゚]+$/u'], @@ -174,4 +186,53 @@ final class CityController extends Controller return redirect()->route('city')->with('error', __('削除に失敗しました。')); } } + + /** + * 自治体ダッシュボード + */ + public function dashboard(Request $request, $city_id) + { + $city = City::find($city_id); + if (!$city) { + return redirect()->route('city')->with('error', '指定された自治体が見つかりません。'); + } + + // この自治体に関連する駐輪場データを取得 + $parks = \App\Models\Park::where('city_id', $city_id)->get(); + $parkIds = $parks->pluck('park_id')->toArray(); + + // この自治体の統計情報を取得 + $contractsCount = 0; + $usersCount = 0; + $waitingCount = 0; + + if (!empty($parkIds)) { + // 契約数を取得 + $contractsCount = \App\Models\RegularContract::whereIn('park_id', $parkIds)->count(); + + // この自治体の駐輪場で契約しているユニークユーザー数を取得 + $userIds = \App\Models\RegularContract::whereIn('park_id', $parkIds) + ->distinct() + ->pluck('user_id') + ->toArray(); + $usersCount = count(array_filter($userIds)); + + // 予約待ち人数を取得(valid_flag = 1 かつ reserve_order が設定されているもの) + $waitingCount = DB::table('reserve') + ->whereIn('park_id', $parkIds) + ->where('valid_flag', 1) + ->whereNotNull('reserve_order') + ->where('reserve_order', '>', 0) + ->count(); + } + + $stats = [ + 'parks_count' => $parks->count(), + 'contracts_count' => $contractsCount, + 'users_count' => $usersCount, + 'waiting_count' => $waitingCount, + ]; + + return view('admin.CityMaster.dashboard', compact('city', 'parks', 'stats')); + } } \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 2567dee..f2835b2 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -300,6 +300,7 @@ タグ発行キュー処理、履歴表示 + @@ -522,58 +523,66 @@ - @php - // 利用者マスタ:ルート名がここに含まれている場合、展開&ハイライト - $userGroupRoutes = [ - 'users', // 利用者マスタ - 'regularcontracts', // 定期契約マスタ - 'reserves', // 定期予約マスタ - 'usertypes', // 定期予約マスタ - ]; - @endphp + + @php + $systemRoutes = ['opes', 'devices', 'operator_ques', 'settings', 'mail_templates']; + @endphp + - + + @php + $masterRoutes = ['inv_settings', 'lottery.master', 'lottery.setting']; + @endphp + @@ -599,108 +608,125 @@ $masterRoutes = ['inv_settings', 'lottery.master', 'lottery.setting']; @endphp - - + + + + + + + + + + +