so-manager-dev.com/app/Http/Controllers/ParkingSearchController.php
Yu Watanabe de257704ab
All checks were successful
Deploy preview (main_watanabe) / deploy (push) Successful in 14s
9/19 マージ
2025-09-19 14:32:44 +09:00

139 lines
6.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Mail;
class ParkingSearchController extends Controller
{
// 初期表示
public function index()
{
$result = $this->getParkData('', '', '');
return view('general.swo5_1', $result);
}
// プルダウン選択
public function search(Request $request)
{
$result = $this->getParkData(
$request->input('conditions_city'),
$request->input('conditions_station'),
$request->input('conditions_park')
);
return view('general.swo5_1', $result);
}
// 検索処理
public function getParkData($city_name, $station_neighbor_station, $park_name)
{
// 検索仕様
// 駐輪場マスタの全件(条件を絞った場合はその条件に一致するもの)を取得。
// 併せて各マスタから追加情報を取得するが、その際のレコードは全て1対1で結びつく想定で暫定実装する
// ※設計書に詳細な記載なし。DBの定義上は1対多の可能性もあるが、その場合現在の画面イメージと矛盾するため、実態として無い想定で進める
// 駐輪場情報検索
$park = \DB::table('park as p')
->select(
'p.park_name',
'p.park_adrs',
'p.price_memo',
'p.park_latitude',
'p.park_longitude',
'p.update_grace_period_start_date',
'p.update_grace_period_start_time',
'p.update_grace_period_end_date',
'p.update_grace_period_end_time',
'c.city_name',
's.station_neighbor_station',
'z.psection_id',
'z.zone_standard'
)
->leftJoin('city as c', 'p.city_id', '=', 'c.city_id')
->leftJoin(\DB::raw(
'(SELECT park_id, station_neighbor_station FROM station WHERE station_id IN (SELECT MAX(station_id) FROM station GROUP BY park_id)) as s'
),'p.park_id','=','s.park_id')
->leftJoin('zone as z', 'p.park_id', '=', 'z.park_id');
// プルダウン指定の条件でwhere句を付与
if (!empty($city_name)) {
$park = $park->where('c.city_name', $city_name);
}
if (!empty($station_neighbor_station)) {
$park = $park->where('s.station_neighbor_station', $station_neighbor_station);
}
if (!empty($park_name)) {
$park = $park->whereRaw("LEFT(p.park_ruby, 1) REGEXP '^[".$park_name."]'");
}
$park = $park->orderBy('p.park_ruby')->get();
// 各マスタから追加情報を取得し、各ボタンの表示有無を判定する
$form_data = [];
$now = date('Y-m-d H:i:s');
foreach ($park as $row) {
// ゾーンマスタの情報から空き台数を取得する
$vacantInfo = \DB::table('zone')
->selectRaw('SUM(zone_tolerance) - SUM(zone_number) as vacant')
->where('psection_id', $row->psection_id)
->groupBy('psection_id')
->first();
// 定期予約マスタから予約中の台数を取得する
$reservedCount = \DB::table('reserve')
->where('psection_id', $row->psection_id)
->where('valid_flag', 1)
->count();
// 更新期間内判定
$update_start = $row->update_grace_period_start_date . ' ' . $row->update_grace_period_start_time;
$update_end = $row->update_grace_period_end_date . ' ' . $row->update_grace_period_end_time;
$is_update_period = ($now >= $update_start && $now <= $update_end);
// ボタン表示有無判定
$vacant = ($vacantInfo ? $vacantInfo->vacant : 0) - $reservedCount;
if ($vacant > 0 && $is_update_period) { // 定期契約ボタン (空き台数が1台以上かつ更新期間内)
$status = 1;
} elseif ($vacant <= 0 && $is_update_period) { // 空き待ち予約ボタン (空き台数が0台以下かつ更新期間内)
$status = 2;
} elseif ($vacant <= 0 && !$is_update_period) { // 販売期間外ボタン (空き台数が0台以下かつ更新期間外)
$status = 3;
} else {
$status = null;
}
// 画面返却用データに追加
$form_data[] = [
'park_name' => $row->park_name,
'city_name' => $row->city_name,
'station_neighbor_station' => $row->station_neighbor_station,
'status' => $status
];
}
// プルダウン用データ取得
$conditions = [$city_name, $station_neighbor_station, $park_name];
$cities = \DB::table('city')->select('city_name')->orderBy('city_id')->get();
$stations = \DB::table('station')->select('station_neighbor_station')->distinct()->orderBy('station_neighbor_station')->get();
$parks = [
'全て'=>'',
'あ行'=>'あいうえおアイウエオ',
'か行'=>'かきくけこがぎぐげごカキクケコガギグゲゴ',
'さ行'=>'さしすせそざじずぜぞサシスセソザジズゼゾ',
'た行'=>'たちつてとだぢづでどタチツテトダヂヅデド',
'な行'=>'なにぬねのナニヌネノ',
'は行'=>'はひふへほばびぶべぼぱぴぷぺぽハヒフヘホバビブベボパピプペポ',
'ま行'=>'まみむめもマミムメモ',
'や行'=>'やゆよヤユヨ',
'ら行'=>'らりるれろラリルレロ',
'わ行'=>'わをんワヲン '
];
// 情報返却
return ['form_data' => $form_data, 'cities' => $cities, 'stations' => $stations, 'parks' => $parks, 'conditions' => $conditions];
}
}