駐輪場検索追加 #20

Merged
y.higashide merged 1 commits from main_higashide into main 2025-09-18 14:00:21 +09:00
10 changed files with 95 additions and 35 deletions

View File

@ -11,14 +11,14 @@ class ParkDetailController extends Controller
public function show($park_id)
{
$park = DB::table('park')->where('park_id', $park_id)->first();
Log::debug('park:', (array)$park);
$zones = DB::table('zone')
->leftJoin('psection', 'zone.psection_id', '=', 'psection.psection_id')
->leftJoin('ptype', 'zone.ptype_id', '=', 'ptype.ptype_id')
->select('zone.*', 'psection.psection_subject', 'ptype.ptype_subject')
->where('zone.park_id', $park_id)
->get();
Log::debug('zones:', $zones->toArray());
$reserves = DB::table('reserve')
->join('zone', function ($join) {
$join->on('reserve.psection_id', '=', 'zone.psection_id')
@ -29,16 +29,7 @@ class ParkDetailController extends Controller
->where('reserve.valid_flag', 1)
->select('reserve.*', 'ptype.ptype_subject')
->get();
Log::debug('reserves:', $reserves->toArray());
$zoneStandardSum = [];
/*foreach ($zones as $zone) {
$psectionId = $zone->psection_id;
if (!isset($zoneStandardSum[$psectionId])) {
$zoneStandardSum[$psectionId] = 0;
}
$zoneStandardSum[$psectionId] += $zone->zone_standard;
}*/
$zoneStandardSum = [];
foreach ($zones as $zone) {
$key = $zone->psection_subject; // 「自転車」「原付」など
@ -47,7 +38,6 @@ class ParkDetailController extends Controller
}
$zoneStandardSum[$key] += $zone->zone_standard;
}
Log::debug('zoneStandardSum:', $zoneStandardSum);
// 空き台数集計用配列
$vacancyData = [];
@ -59,7 +49,6 @@ class ParkDetailController extends Controller
// zone_tolerance - zone_number を合計
$vacancyData[$key] += ($zone->zone_tolerance - $zone->zone_number);
}
Log::debug('vacancyData:', $vacancyData);
// reserve件数分を減算
foreach ($reserves as $reserve) {
@ -77,11 +66,37 @@ class ParkDetailController extends Controller
})
->get()
->keyBy('city_id');
Log::debug('city_grace_periods:', $city_grace_periods->toArray());
// 必要なら他テーブルJOINや追加情報も取得
return response()->json([
'html' => view('regular_contract.park_detail', compact('park', 'zones', 'reserves', 'zoneStandardSum', 'vacancyData', 'city_grace_periods'))->render()
]);
}
public function showWait($reserve_id)
{
$reserve = DB::table('reserve')->where('reserve_id', $reserve_id)->first();
$park = DB::table('park')->where('park_id', $reserve->park_id)->first();
$zones = DB::table('zone')
->leftJoin('psection', 'zone.psection_id', '=', 'psection.psection_id')
->leftJoin('ptype', 'zone.ptype_id', '=', 'ptype.ptype_id')
->select('zone.*', 'psection.psection_subject', 'ptype.ptype_subject')
->where('zone.park_id', $park->park_id)
->get();
$zoneStandardSum = [];
foreach ($zones as $zone) {
$key = $zone->psection_subject; // 「自転車」「原付」など
if (!isset($zoneStandardSum[$key])) {
$zoneStandardSum[$key] = 0;
}
$zoneStandardSum[$key] += $zone->zone_standard;
}
// 必要なら他テーブルJOINや追加情報も取得
return response()->json([
'html' => view('park_waitlist.park_detail', compact('park', 'zones', 'reserve', 'zoneStandardSum'))->render()
]);
}
}

View File

@ -13,7 +13,7 @@ use function redirect;
class RegularContractCreateController extends Controller
{
// 新規作成画面表示
public function show()
public function show(Request $request)
{
$user_id = session('user_id');
if (!$user_id) {
@ -108,12 +108,24 @@ class RegularContractCreateController extends Controller
->get()
->groupBy('park_id');
\Log::info('新規定期契約-駐輪場選択画面にアクセス', [
'user_id' => $user_id,
]);
// ルート名で画面表示を切り替え(新規定期契約 or 駐輪場検索)
$isRegularContract = $request->route()->getName() === 'regular_contract.create';
// ヘッダーの選択状態を分岐
$active_menu = $isRegularContract ? 'SWC-8-1' : 'SWC-10-1';
if ($isRegularContract) {
\Log::info('新規定期契約-駐輪場選択画面にアクセス', [
'user_id' => $user_id,
]);
} else {
\Log::info('駐輪場検索-駐輪場選択画面にアクセス', [
'user_id' => $user_id,
]);
}
return view('regular_contract.create', [
'active_menu' => 'SWC-8-1', // この画面のID
'active_menu' => $active_menu, // この画面のID
'user_name' => $user ? $user->user_name : '', // ユーザー名(ヘッダー用)
'cities' => $cities,
'stations' => $stations,
@ -125,6 +137,7 @@ class RegularContractCreateController extends Controller
'zones' => $zones,
'city_grace_periods' => $city_grace_periods,
'reserve' => $reserve,
'isRegularContract' => $isRegularContract
]);
}

View File

@ -7,6 +7,7 @@ use Illuminate\Support\Facades\Auth;
use App\Models\User;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Log;
use App\Mail\WithdrawCompleteMail;
class UserWithdrawController extends Controller

View File

@ -130,6 +130,21 @@ $(document).on('click', '.btn-popup', function () {
});
});
$(document).on('click', '.btn-reserve-popup', function () {
var reserveId = $(this).data('reserve-id');
$.ajax({
url: '/api/park-detail-wait/' + reserveId,
method: 'GET',
success: function (data) {
$('#modalArea').html(data.html); // モーダル全体を挿入
$('#parkDetailWaitModal').modal('show'); // モーダルを表示
},
error: function () {
alert('詳細情報の取得に失敗しました');
}
});
});
$(document).on('click', '.btn-reserve', function (e) {
e.preventDefault();
var parkId = $(this).data('park-id');
@ -141,8 +156,19 @@ $(document).on('click', '.btn-reserve', function (e) {
content: 'こちらの駐輪場を予約しますか?<br>お申込みいただく各自治体の条例等によって、駐輪場までの距離制限等によりご契約いただけない場合がございます。<br>予めご了承くださいますようお願いいたします。',
buttons: {
OK: function () {
// GETパラメータでregulationメソッドに遷移
location.href = '/park-waitlist/create?park_id=' + parkId + '&psection_id=' + psectionId + '&ptype_id=' + ptypeId;
// Ajaxで予約済みかチェック
$.get('/park-waitlist/check', {
park_id: parkId,
psection_id: psectionId,
ptype_id: ptypeId
}, function (response) {
if (response.status === 'exists') {
$.alert('こちらの駐輪場は予約済みです。');
} else {
// 予約画面へ遷移
location.href = '/park-waitlist/create?park_id=' + parkId + '&psection_id=' + psectionId + '&ptype_id=' + ptypeId;
}
});
},
キャンセル: function () { }
}

View File

@ -9,7 +9,7 @@
<link href="https://cdnjs.cloudflare.com/ajax/libs/typicons/2.0.9/typicons.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/earlyaccess/roundedmplus1c.css" rel="stylesheet">
<link href="{{ asset('assets/css/mypage/slick.css') }}" rel="stylesheet">
<link href="{{ asset('assets/css/mypage/slick-theme.css') }}" rel="stylesheet">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick-theme.css"/>
<link rel="stylesheet" href="{{ asset('assets/css/mypage/font-awesome.min.css') }}">
<link href="{{ asset('assets/css/mypage/bootstrap.min.css') }}" rel="stylesheet">
<link rel="stylesheet" href="{{ asset('assets/css/mypage/all.css') }}">

View File

@ -1,12 +1,11 @@
@php
// コントローラーから $user_name を渡してください
if (!isset($user_name)) $user_name = '';
@endphp
<header id="top" class="bg-light">
<div class="container pt10">
<div class="row mt10 mb10">
<div class="col-5 col-lg-4">
<a id="site-logo" class="navbar-brand" href="{{ url('../index.html') }}">
<a id="site-logo" class="navbar-brand" href="{{ url('/mypage') }}">
<img src="{{ asset('assets/img/so-rin_logo.png') }}" alt="logo" />
<h1>
<span class="small pc">駐車場・駐輪場総合サポートの株式会社ソーリン<br></span>
@ -15,12 +14,11 @@ if (!isset($user_name)) $user_name = '';
</a>
</div>
<div class="col-6 col-lg-4 ml-auto tl-btn-area">
<a href="{{ url('SWO-4-1.html') }}" class="" id="login-btn">
<a href="{{ url('/mypage') }}" class="" id="login-btn">
<span class="small d-none d-xl-inline">ようこそ</span>{{ $user_name }}さん
</a>
<a href="{{ url('../index.html') }}" class="btn btn-outline-secondary badge-pill pc" id="sub-btn">ログアウト</a>
<a href="{{ url('/logout') }}" class="btn btn-outline-secondary badge-pill pc" id="sub-btn">ログアウト</a>
<a class="d-lg-none h2" data-toggle="collapse" data-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample" href="#collapseExample" id="nav-menu-btn">
<span class="typcn typcn-th-menu"></span>
</a>
</div>
</div>

View File

@ -15,15 +15,15 @@ if (!isset($active_menu)) $active_menu = '';
<a id="my-menu-btn" class="navbar-toggler text-center" href="#navbarSupportedContent" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> マイメニューを開く </a>
<div class="collapse navbar-collapse justify-content-around" id="navbarSupportedContent">
<ul class="navbar-nav">
<li class="nav-item {{ $active_menu == 'SWO-4-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('SWO-4-1.html') }}">マイページトップ<span class="sr-only">(current)</span></a></li>
<li class="nav-item {{ $active_menu == 'SWO-4-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('/mypage') }}">マイページトップ<span class="sr-only">(current)</span></a></li>
<li class="nav-item {{ $active_menu == 'SWC-1-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('/user/info') }}">ユーザー情報確認</a></li>
<li class="nav-item {{ $active_menu == 'SWC-3-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('/regular_contract/info') }}">定期契約情報</a></li>
<li class="nav-item {{ $active_menu == 'SWC-4-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('/regular_contract/update') }}">契約更新</a></li>
<li class="nav-item {{ $active_menu == 'SWC-6-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('/regular_contract/history') }}">契約履歴</a></li>
<li class="nav-item {{ $active_menu == 'SWC-8-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('/regular_contract/create') }}">新規定期契約</a></li>
<li class="nav-item {{ $active_menu == 'SWC-11-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('/park_waitlist') }}">空き待ち状況確認</a></li>
<li class="nav-item {{ $active_menu == 'SWC-10-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('SWC-10-1.html') }}">駐輪場検索</a></li>
<li class="nav-item"><a class="nav-link" href="{{ url('../howto.html') }}" target="_blank">このページの使い方</a></li>
<li class="nav-item {{ $active_menu == 'SWC-10-1' ? 'active' : '' }}"><a class="nav-link" href="{{ url('/park_search') }}">駐輪場検索</a></li>
<li class="nav-item"><a class="nav-link" href="{{ route('swo16_1') }}" target="_blank">このページの使い方</a></li>
</ul>
</div>
</nav>

View File

@ -42,7 +42,7 @@
</div>
<div class="col-6 col-md-2 mb20">
<div class="card text-center border-success">
<a href="{{ url('SWC-10-1.html') }}" target="_top">
<a href="{{ url('/park_search') }}" target="_top">
<figure><img src="{{ asset('assets/img/menu-aki.png') }}" alt="" class="w-75 mt10"></figure>
<p class="text-success">駐輪場検索</p><br>
</a>
@ -66,7 +66,7 @@
</div>
<div class="col-6 col-md-2 mb20">
<div class="card text-center border-success">
<a href="{{ url('../index.html') }}" target="_top">
<a href="{{ route('logout') }}" target="_top">
<figure><img src="{{ asset('assets/img/menu-logout.png') }}" alt="" class="w-75 mt10"></figure>
<p class="text-success">ログアウト</p>
</a>
@ -74,7 +74,7 @@
</div>
<div class="col-6 col-md-2 mb20">
<div class="card text-center border-success">
<a href="{{ url('../howto.html') }}" target="_blank">
<a href="{{ route('swo16_1') }}" target="_blank">
<figure><img src="{{ asset('assets/img/menu-help.png') }}" alt="" class="w-75 mt10"></figure>
<p class="text-success">このページの使い方</p>
</a>

View File

@ -2,7 +2,11 @@
@section('content')
<main>
<header class="alert alert-success">
@if($isRegularContract)
<h4 class="container">新規定期契約 > 空き駐輪場を確認する</h4>
@else
<h4 class="container">駐輪場検索 > 駐輪場選択</h4>
@endif
</header>
<section id="" class="container mt20 mb20">
<div class="row">
@ -122,9 +126,9 @@
@endphp
@if ($vacancy > 0 && $inGrace)
<button class="btn btn-block btn-sm btn-outline-success btn_82-table btn-popup" data-park-id="{{ $row->park_id }}">定期契約</button>
@elseif ($vacancy > 0 && !$inGrace)
@elseif (!$inGrace)
<button class="btn btn-block btn-sm btn-outline-danger btn_103-table btn-popup" data-park-id="{{ $row->park_id }}">販売期間外</button>
@else
@elseif ($vacancy <= 0 && $inGrace)
<button class="btn btn-block btn-sm btn-outline-danger btn_103-table btn-popup" data-park-id="{{ $row->park_id }}">空き待ち申込</button>
@endif
@empty

View File

@ -158,6 +158,9 @@ Route::post('regular_contract/update_period', [RegularContractController::class,
// 定期契約履歴
Route::get('regular_contract/history', [RegularContractController::class, 'showHistory'])
->name('regular_contract.history');
// 駐輪場検索
Route::get('park_search', [RegularContractCreateController::class, 'show'])
->name('park_search');
// 空き待ち状況確認画面
Route::get('park_waitlist', [ParkWaitlistController::class, 'index'])