From c7db94973b3c7fbe67825cfe7db300a87e236233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=A0=E7=9A=84=E5=90=8D=E5=AD=97?= <你的邮箱> Date: Wed, 24 Sep 2025 10:27:25 +0900 Subject: [PATCH] =?UTF-8?q?[=E5=A5=91=E7=B4=84=E8=80=85=E4=B8=80=E8=A6=A7]?= =?UTF-8?q?[=E6=9C=AA=E6=9B=B4=E6=96=B0=E8=80=85=E4=B8=80=E8=A6=A7]?= =?UTF-8?q?=E7=B5=9E=E3=82=8A=E8=BE=BC=E3=81=BF=E6=9D=A1=E4=BB=B6=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Admin/ContractorController.php | 112 +++++-- .../Admin/ContractorListController.php | 148 ++++++--- .../views/admin/contractor/list.blade.php | 284 ++++++++++------- .../admin/contractor_list/list.blade.php | 290 +++++++++++------- 4 files changed, 554 insertions(+), 280 deletions(-) diff --git a/app/Http/Controllers/Admin/ContractorController.php b/app/Http/Controllers/Admin/ContractorController.php index eaf43bf..1365137 100644 --- a/app/Http/Controllers/Admin/ContractorController.php +++ b/app/Http/Controllers/Admin/ContractorController.php @@ -14,6 +14,7 @@ class ContractorController extends Controller public function list(Request $request) { $q = DB::table('regular_contract as rc') + ->leftJoin('user as u','rc.user_id','=','u.user_id') ->select([ 'rc.contract_id', 'rc.contract_qr_id', @@ -52,37 +53,110 @@ class ContractorController extends Controller 'u.user_workplace', 'u.user_school', 'u.user_remarks', - // 他に必要なカラムもここに追加 + 'u.user_tag_serial_64', + 'u.user_reduction', + DB::raw('rc.user_securitynum as crime_prevention'), + DB::raw('rc.contract_seal_issue as seal_issue_count'), + DB::raw("CASE rc.enable_months + WHEN 1 THEN '月極(1ヶ月)' + WHEN 3 THEN '3ヶ月' + WHEN 6 THEN '6ヶ月' + WHEN 12 THEN '年' + ELSE CONCAT(rc.enable_months, 'ヶ月') END as ticket_type"), + DB::raw('ps.psection_subject as vehicle_type'), + // 利用者分類名(usertype テーブル) + DB::raw('ut.usertype_subject1 as user_category1'), + DB::raw('ut.usertype_subject2 as user_category2'), + DB::raw('ut.usertype_subject3 as user_category3'), ]) ->leftJoin('park as p', 'rc.park_id', '=', 'p.park_id') - ->leftJoin('user as u', 'rc.user_id', '=', 'u.user_id'); + ->leftJoin('psection as ps', 'rc.psection_id', '=', 'ps.psection_id') + ->leftJoin('usertype as ut', 'u.user_categoryid', '=', 'ut.user_categoryid'); - // 検索条件例 - if ($request->filled('contract_id')) { - $q->where('rc.contract_id', $request->input('contract_id')); + // ===== 絞り込み条件 ===== + // 駐輪場 + if ($request->filled('park_id')) { + $q->where('rc.park_id', $request->park_id); } - if ($request->filled('name')) { - $q->where('u.user_name', 'like', '%' . $request->input('name') . '%'); + // 利用者ID(完全一致) + if ($request->filled('user_id')) { + $q->where('rc.user_id', $request->user_id); } - // タグ・QR(完全一致、空白なら絞り込まない) - if ($request->filled('tag_qr_flag') && $request->input('tag_qr_flag') !== '') { - $q->where('rc.tag_qr_flag', $request->input('tag_qr_flag')); + // 分類名1(完全一致): ut.usertype_subject1 = 入力値 + if ($request->filled('user_category1')) { + $q->where('ut.usertype_subject1', $request->user_category1); + } + // タグシリアル64進(部分一致) + if ($request->filled('user_tag_serial_64')) { + $val = $request->user_tag_serial_64; + $q->where('u.user_tag_serial_64','like','%'.$val.'%'); + } + // 有効期限(契約有効期間 終了日:指定日以前を抽出) + if ($request->filled('contract_periode')) { + $raw = trim($request->contract_periode); + $norm = str_replace('/', '-', $raw); // スラッシュ入力許容 + try { + $target = \Carbon\Carbon::parse($norm)->format('Y-m-d'); + // 指定日 “以前” を含む (以前のみなら '<' に変更) + $q->whereDate('rc.contract_periode', '>=', $target); + } catch (\Exception $e) { + // 不正日付は無視 + } + } + // フリガナ(部分一致) + if ($request->filled('user_phonetic')) { + $q->where('u.user_phonetic', 'like', '%' . $request->user_phonetic . '%'); + } + // 携帯電話(部分一致) + if ($request->filled('user_mobile')) { + $q->where('u.user_mobile', 'like', '%' . $request->user_mobile . '%'); + } + // メール(部分一致) + if ($request->filled('user_primemail')) { + $q->where('u.user_primemail', 'like', '%' . $request->user_primemail . '%'); + } + // 勤務先(部分一致) + if ($request->filled('user_workplace')) { + $q->where('u.user_workplace', 'like', '%' . $request->user_workplace . '%'); + } + // 学校(部分一致) + if ($request->filled('user_school')) { + $q->where('u.user_school', 'like', '%' . $request->user_school . '%'); + } + // タグ・QR(完全一致) + if ($request->filled('tag_qr_flag') && $request->tag_qr_flag !== '') { + $q->where('rc.tag_qr_flag', $request->tag_qr_flag); } // ソート処理 - $sort = $request->input('sort', 'rc.contract_id'); - $sortType = $request->input('sort_type', 'desc'); - // カラム名のバリデーション(必要に応じて拡張) - $allowSorts = ['rc.contract_id']; - if (!in_array($sort, $allowSorts)) { - $sort = 'rc.contract_id'; + // パラメータが来た時だけ適用。未指定なら主キー昇順 + $sort = $request->input('sort'); // null 許容 + $sortType = $request->input('sort_type','asc'); + + $allowSorts = [ + 'rc.contract_id', + 'rc.user_id', + 'u.user_name', + 'rc.tag_qr_flag', + 'p.park_name', + ]; + if ($sort && in_array($sort, $allowSorts)) { + $sortType = $sortType === 'desc' ? 'desc' : 'asc'; + $q->orderBy($sort, $sortType); + } else { + // 初期表示は契約ID昇順 (物理順に近い) + $sort = null; + $sortType = null; + $q->orderBy('rc.contract_id','asc'); } - $sortType = ($sortType === 'asc') ? 'asc' : 'desc'; - $rows = $q->orderBy($sort, $sortType)->paginate(20)->withQueryString(); + $rows = $q->paginate(20)->appends($request->query()); - return view('admin.contractor.list', compact('rows', 'sort', 'sortType')); + // 駐輪場セレクト用 + $parks = DB::table('park')->select('park_id', 'park_name')->orderBy('park_name')->get(); + + return view('admin.contractor.list', compact('rows', 'sort', 'sortType', 'parks')); } /** diff --git a/app/Http/Controllers/Admin/ContractorListController.php b/app/Http/Controllers/Admin/ContractorListController.php index 2b5f27f..ae1ae7c 100644 --- a/app/Http/Controllers/Admin/ContractorListController.php +++ b/app/Http/Controllers/Admin/ContractorListController.php @@ -9,11 +9,12 @@ use Illuminate\Support\Facades\DB; class ContractorListController extends Controller { /** - * 一覧表示(GET/POST) + * 未更新者一覧 (contract_renewal IS NULL) */ public function list(Request $request) { $q = DB::table('regular_contract as rc') + ->leftJoin('user as u','rc.user_id','=','u.user_id') ->select([ 'rc.contract_id', 'rc.contract_qr_id', @@ -33,7 +34,6 @@ class ContractorListController extends Controller 'rc.contract_manual', 'rc.contract_notice', 'p.park_name', - // userテーブルの正しいカラム名 'u.user_name', 'u.user_phonetic', 'u.user_mobile', @@ -53,64 +53,110 @@ class ContractorListController extends Controller 'u.user_workplace', 'u.user_school', 'u.user_remarks', - // 他に必要なカラムもここに追加 + 'u.user_tag_serial_64', + 'u.user_reduction', + DB::raw('rc.user_securitynum as crime_prevention'), + DB::raw('rc.contract_seal_issue as seal_issue_count'), + DB::raw("CASE rc.enable_months + WHEN 1 THEN '月極(1ヶ月)' + WHEN 3 THEN '3ヶ月' + WHEN 6 THEN '6ヶ月' + WHEN 12 THEN '年' + ELSE CONCAT(rc.enable_months, 'ヶ月') END as ticket_type"), + DB::raw('ps.psection_subject as vehicle_type'), + // 利用者分類名(usertype テーブル) + DB::raw('ut.usertype_subject1 as user_category1'), + DB::raw('ut.usertype_subject2 as user_category2'), + DB::raw('ut.usertype_subject3 as user_category3'), ]) ->leftJoin('park as p', 'rc.park_id', '=', 'p.park_id') - ->leftJoin('user as u', 'rc.user_id', '=', 'u.user_id'); + ->leftJoin('psection as ps', 'rc.psection_id', '=', 'ps.psection_id') + ->leftJoin('usertype as ut', 'u.user_categoryid', '=', 'ut.user_categoryid'); - // 検索条件例 - if ($request->filled('contract_id')) { - $q->where('rc.contract_id', $request->input('contract_id')); + // ===== 絞り込み条件 ===== + // 駐輪場 + if ($request->filled('park_id')) { + $q->where('rc.park_id', $request->park_id); } - if ($request->filled('name')) { - $q->where('u.user_name', 'like', '%' . $request->input('name') . '%'); + // 利用者ID(完全一致) + if ($request->filled('user_id')) { + $q->where('rc.user_id', $request->user_id); + } + // 分類名1(完全一致) + if ($request->filled('user_category1')) { + $q->where('ut.usertype_subject1', $request->user_category1); + } + // タグシリアル64進(部分一致) + if ($request->filled('user_tag_serial_64')) { + $val = $request->user_tag_serial_64; + $q->where('u.user_tag_serial_64','like','%'.$val.'%'); + } + // 有効期限(契約有効期間 終了日:指定日以前を抽出) + if ($request->filled('contract_periode')) { + $raw = trim($request->contract_periode); + $norm = str_replace('/', '-', $raw); // スラッシュ入力許容 + try { + $target = \Carbon\Carbon::parse($norm)->format('Y-m-d'); + // 指定日 “以前” を含む (以前のみなら '<' に変更) + $q->whereDate('rc.contract_periode', '>=', $target); + } catch (\Exception $e) { + // 不正日付は無視 + } + } + // フリガナ(部分一致) + if ($request->filled('user_phonetic')) { + $q->where('u.user_phonetic', 'like', '%' . $request->user_phonetic . '%'); + } + // 携帯電話(部分一致) + if ($request->filled('user_mobile')) { + $q->where('u.user_mobile', 'like', '%' . $request->user_mobile . '%'); + } + // メール(部分一致) + if ($request->filled('user_primemail')) { + $q->where('u.user_primemail', 'like', '%' . $request->user_primemail . '%'); + } + // 勤務先(部分一致) + if ($request->filled('user_workplace')) { + $q->where('u.user_workplace', 'like', '%' . $request->user_workplace . '%'); + } + // 学校(部分一致) + if ($request->filled('user_school')) { + $q->where('u.user_school', 'like', '%' . $request->user_school . '%'); + } + // タグ・QR(完全一致) + if ($request->filled('tag_qr_flag') && $request->tag_qr_flag !== '') { + $q->where('rc.tag_qr_flag', $request->tag_qr_flag); } - // タグ・QR(完全一致、空白なら絞り込まない) - if ($request->filled('tag_qr_flag') && $request->input('tag_qr_flag') !== '') { - $q->where('rc.tag_qr_flag', $request->input('tag_qr_flag')); + // ---- ソート ---- + $sort = $request->input('sort',''); // 初期は未指定 + $sortType = $request->input('sort_type','asc'); + $allowSorts = [ + 'user_id' => 'rc.user_id', + 'user_name' => 'u.user_name', + 'contract_id' => 'rc.contract_id', + 'tag_qr_flag' => 'rc.tag_qr_flag', + 'park_name' => 'p.park_name', + ]; + if($sort !== '' && isset($allowSorts[$sort])){ + $sortType = $sortType === 'desc' ? 'desc' : 'asc'; + $q->orderBy($allowSorts[$sort], $sortType) + ->orderBy('rc.contract_id','asc'); // セカンダリ安定 + } else { + // 初期表示: DB登録順の近似(PK昇順) + $sort = ''; // Blade 側で未ソート状態 + $q->orderBy('rc.contract_id','asc'); } - // ソート処理 - $sort = $request->input('sort', 'rc.contract_id'); - $sortType = $request->input('sort_type', 'desc'); - // カラム名のバリデーション(必要に応じて拡張) - $allowSorts = ['rc.contract_id']; - if (!in_array($sort, $allowSorts)) { - $sort = 'rc.contract_id'; - } - $sortType = ($sortType === 'asc') ? 'asc' : 'desc'; + // 駐輪場選択 + $parks = DB::table('park') + ->select('park_id','park_name') + ->orderBy('park_name') + ->orderBy('park_id') + ->get(); - $rows = $q->orderBy($sort, $sortType)->paginate(20)->withQueryString(); + $rows = $q->paginate(20)->appends($request->query()); - return view('admin.contractor_list.list', compact('rows', 'sort', 'sortType')); - } - - /** - * 詳細表示 - */ - public function info($id) - { - $contract = DB::table('regular_contract as rc') - ->select([ - 'rc.*', - 'p.park_name', - 'u.user_name', - 'u.user_phonetic', - 'u.user_mobile', - 'u.user_homephone', - 'u.user_primemail', - 'u.user_gender', - 'u.user_birthdate', - 'u.user_regident_city', - ]) - ->leftJoin('park as p', 'rc.park_id', '=', 'p.park_id') - ->leftJoin('user as u', 'rc.user_id', '=', 'u.user_id') - ->where('rc.contract_id', $id) - ->first(); - - if (!$contract) { abort(404); } - - return view('admin.contractor.info', compact('contract')); + return view('admin.contractor_list.list', compact('rows','sort','sortType','parks')); } } diff --git a/resources/views/admin/contractor/list.blade.php b/resources/views/admin/contractor/list.blade.php index e1b8a0e..d50052d 100644 --- a/resources/views/admin/contractor/list.blade.php +++ b/resources/views/admin/contractor/list.blade.php @@ -23,7 +23,9 @@
| 利用者ID | -氏名 | -フリガナ | -- - 定期契約ID - @if(request('sort') === 'contract_id') - @if(request('sort_type') === 'asc') - ▲ - @else - ▼ - @endif - @endif - - | -タグ・QR | -駐輪場 | -車種区分 | -減免措置 | -利用者分類1 | -利用者分類2 | -利用者分類3 | -携帯電話番号 | -自宅電話番号 | -生年月日 | -性別 | -居住所:郵便番号 | -居住所:都道府県 | -居住所:市区群 | -居住所:住所 | -関連住所:郵便番号 | -関連住所:都道府県 | -関連住所:市区群 | -関連住所:住所 | -契約日 | -利用期間 | -有効期間 | -定期券区分 | -勤務先名 | -学校 | -卒業予定 | -シール発行回数 | -防犯登録 | -備考 | -
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + 利用者ID↑↓ + | ++ 氏名↑↓ + | +フリガナ | ++ 定期契約ID↑↓ + | ++ タグ・QR↑↓ + | ++ 駐輪場↑↓ + | +車種区分 | +減免措置 | +利用者分類1 | +利用者分類2 | +利用者分類3 | +携帯電話番号 | +自宅電話番号 | +生年月日 | +性別 | +居住所:郵便番号 | +居住所:都道府県 | +居住所:市区群 | +居住所:住所 | +関連住所:郵便番号 | +関連住所:都道府県 | +関連住所:市区群 | +関連住所:住所 | +契約日 | +利用期間 | +有効期間 | +定期券区分 | +勤務先名 | +学校 | +卒業予定 | +シール発行回数 | +防犯登録 | +備考 | +
| {{ $row->user_id }} | -{{ $row->user_name }} | -{{ $row->user_phonetic }} | -{{ $row->contract_id }} | -{{ $row->tag_qr_flag ? 'QR' : 'タグ' }} | -{{ $row->park_name }} | -{{ $row->vehicle_type ?? '' }} | -{{ $row->user_reduction ?? '' }} | -{{ $row->user_category1 ?? '' }} | -{{ $row->user_category2 ?? '' }} | -{{ $row->user_category3 ?? '' }} | -{{ $row->user_mobile }} | -{{ $row->user_homephone }} | -{{ $row->user_birthdate }} | -{{ $row->user_gender }} | -{{ $row->user_regident_zip }} | -{{ $row->user_regident_pre }} | -{{ $row->user_regident_city }} | -{{ $row->user_regident_add }} | -{{ $row->user_relate_zip }} | -{{ $row->user_relate_pre }} | -{{ $row->user_relate_city }} | -{{ $row->user_relate_add }} | -{{ $row->contract_created_at }} | -{{ $row->contract_periods }} | -{{ $row->contract_periode }} | -{{ $row->ticket_type ?? '' }} | -{{ $row->user_workplace }} | -{{ $row->user_school }} | -{{ $row->user_graduate }} | -{{ $row->seal_issue_count ?? '' }} | -{{ $row->crime_prevention ?? '' }} | -{{ $row->user_remarks }} | -
| データがありません。 | -||||||||||||||||||||||||||||||||
| {{ $row->user_id }} | +{{ $row->user_name }} | +{{ $row->user_phonetic }} | +{{ $row->contract_id }} | +{{ $row->tag_qr_flag ? 'QR' : 'タグ' }} | +{{ $row->park_name }} | +{{ $row->vehicle_type ?? '' }} | +{{ $row->user_reduction ?? '' }} | +{{ $row->user_category1 ?? '' }} | +{{ $row->user_category2 ?? '' }} | +{{ $row->user_category3 ?? '' }} | +{{ $row->user_mobile }} | +{{ $row->user_homephone }} | +{{ $row->user_birthdate }} | +{{ $row->user_gender }} | +{{ $row->user_regident_zip }} | +{{ $row->user_regident_pre }} | +{{ $row->user_regident_city }} | +{{ $row->user_regident_add }} | +{{ $row->user_relate_zip }} | +{{ $row->user_relate_pre }} | +{{ $row->user_relate_city }} | +{{ $row->user_relate_add }} | +{{ $row->contract_created_at }} | +{{ $row->contract_periods }} | +{{ $row->contract_periode }} | +{{ $row->ticket_type ?? '' }} | +{{ $row->user_workplace }} | +{{ $row->user_school }} | +{{ $row->user_graduate }} | +{{ $row->seal_issue_count ?? '' }} | +{{ $row->crime_prevention ?? '' }} | +{{ $row->user_remarks }} | +
| データがありません。 | +||||||||||||||||||||||||||||||||