From a58d94a62954b286a7fc78a2ebd63a808e830393 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=A0=E7=9A=84=E5=90=8D=E5=AD=97?= <你的邮箱> Date: Fri, 5 Sep 2025 16:07:27 +0900 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E3=82=BF=E3=82=B0=E7=99=BA=E8=A1=8C?= =?UTF-8?q?=E3=82=AD=E3=83=A5=E3=83=BC=E5=87=A6=E7=90=86=E3=80=81=E5=B1=A5?= =?UTF-8?q?=E6=AD=B4=E8=A1=A8=E7=A4=BA=E3=80=91=E3=83=9C=E3=82=BF=E3=83=B3?= =?UTF-8?q?=E5=8B=95=E4=BD=9C=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Admin/TagissueController.php | 184 ++++++++- .../views/admin/tag_issue/list.blade.php | 365 ++++++++++++------ routes/web.php | 6 +- 3 files changed, 421 insertions(+), 134 deletions(-) diff --git a/app/Http/Controllers/Admin/TagissueController.php b/app/Http/Controllers/Admin/TagissueController.php index 6f1cbca..63d2e9e 100644 --- a/app/Http/Controllers/Admin/TagissueController.php +++ b/app/Http/Controllers/Admin/TagissueController.php @@ -5,37 +5,181 @@ namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Barryvdh\DomPDF\Facade\Pdf; class TagissueController extends Controller { + // タグ発送宛名PDF生成 + public function printUnissuedLabels(Request $request) + { + $ids = $request->input('ids', []); + if (empty($ids) || !is_array($ids)) { + return back()->with('error', '1件以上選択してください。'); + } + // 利用者情報取得 + $users = DB::table('user') + ->whereIn('user_id', $ids) + ->select('user_name', 'user_regident_zip', 'user_regident_pre') + ->get(); + + // PDF生成(Laravel-dompdf使用例) + $pdfHtml = view('admin.tag_issue.pdf_labels', ['users' => $users])->render(); + $pdf = \PDF::loadHTML($pdfHtml); + return $pdf->download('tag_labels.pdf'); + } public function list(Request $request) { - // userテーブルから必要なカラムを取得 - $query = DB::table('user') - ->select( - 'user_seq', - 'user_tag_serial', - 'user_tag_serial_64', - 'user_tag_issue', - 'user_name', - 'user_mobile', - 'user_homephone', - 'user_regident_zip', - 'user_regident_pre', - 'user_regident_city', - 'user_regident_add' - ) - ->orderByDesc('user_seq'); + // 絞り込み条件 + $filterType = $request->input('filter_type'); // 'unissued', 'issued', 'all', 'unissued_toggle' + $tagSerial = $request->input('tag_serial'); + $tagSerial64 = $request->input('tag_serial_64'); - // 必要に応じてフィルタ追加 - // if ($request->filled('user_tag_issue')) { - // $query->where('user_tag_issue', $request->input('user_tag_issue')); - // } + // ソートパラメータ取得 + $sort = $request->input('sort'); + $sortType = $request->input('sort_type', 'asc'); + + // userテーブルとoperator_queテーブルをJOIN + $query = DB::table('user') + ->leftJoin('operator_que', 'user.user_id', '=', 'operator_que.user_id') + ->select( + 'user.user_seq', + 'user.user_id', + 'user.user_tag_serial', + 'user.user_tag_serial_64', + 'user.user_tag_issue', + 'user.user_name', + 'user.user_mobile', + 'user.user_homephone', + 'user.user_regident_zip', + 'user.user_regident_pre', + 'user.user_regident_city', + 'user.user_regident_add', + 'operator_que.que_id', + 'operator_que.que_class', + 'operator_que.que_status' + ); + + // ソート項目に応じたorderBy + switch ($sort) { + case 'que_id': + $query->orderBy('operator_que.que_id', $sortType); + break; + case 'user_tag_serial': + $query->orderBy('user.user_tag_serial', $sortType); + break; + case 'user_tag_serial_64': + $query->orderBy('user.user_tag_serial_64', $sortType); + break; + case 'user_tag_issue': + $query->orderBy('user.user_tag_issue', $sortType); + break; + case 'user_name': + $query->orderBy('user.user_name', $sortType); + break; + default: + $query->orderByDesc('user.user_seq'); + } + + // 【種別フィルター】タグ未発送(通常) + if ($filterType === 'unissued') { + $query->where('operator_que.que_class', 3) + ->where('operator_que.que_status', 1); + } + // 【種別フィルター】タグ未発送トグル(que_class=3かつque_status≠3) + if ($filterType === 'unissued_toggle') { + $query->where('operator_que.que_class', 3) + ->where('operator_que.que_status', '<>', 3); + } + // 【種別フィルター】タグ発送済み(通常) + if ($filterType === 'issued') { + $query->where('operator_que.que_class', 3) + ->where('operator_que.que_status', 3); + } + // 【種別フィルター】タグ発送済みトグル(que_class=3 and que_status=3) + if ($filterType === 'issued_toggle') { + $query->where('operator_que.que_class', 3) + ->where('operator_que.que_status', 3); + } + // 【タグシリアル・タグシリアル64進フィルター】 + if (!empty($tagSerial)) { + $query->where('user.user_tag_serial', 'like', "%$tagSerial%"); + } + if (!empty($tagSerial64)) { + $query->where('user.user_tag_serial_64', 'like', "%$tagSerial64%"); + } $users = $query->paginate(20); return view('admin.tag_issue.list', [ 'users' => $users, + 'filterType' => $filterType, + 'tagSerial' => $tagSerial, + 'tagSerial64' => $tagSerial64, + 'sort' => $sort, + 'sortType' => $sortType, ]); } + + // ステータス変更(タグ発送済み/未発送) + public function updateStatus(Request $request) + { + $ids = $request->input('ids', []); // チェックされたuser_id配列 + $action = $request->input('action'); // 'to_issued' or 'to_unissued' + if (empty($ids) || !is_array($ids)) { + return back()->with('error', 'チェックボックスを選択してください。'); + } + $operatorId = auth()->id(); + $now = now(); + // 対象ユーザーのoperator_queを取得 + $ques = DB::table('operator_que')->whereIn('user_id', $ids)->get(); + if ($action === 'to_issued') { + $alreadyIssued = $ques->where('que_status', 3)->pluck('user_id')->toArray(); + if (count($alreadyIssued) > 0) { + return back()->with('error', 'すでにタグ発送済みのユーザーが含まれています。'); + } + // 確認ダイアログはJS側で + DB::table('operator_que')->whereIn('user_id', $ids) + ->update(['que_status' => 3, 'updated_at' => $now, 'operator_id' => $operatorId]); + return back()->with('success', 'ステータスをタグ発送済に変更しました。'); + } + if ($action === 'to_unissued') { + $alreadyUnissued = $ques->where('que_status', 1)->pluck('user_id')->toArray(); + if (count($alreadyUnissued) > 0) { + // 既にタグ未発送のユーザー名を取得 + $names = DB::table('user')->whereIn('user_id', $alreadyUnissued)->pluck('user_name')->toArray(); + return back()->with('error', 'すでにタグ未発送のユーザーが含まれています: ' . implode(', ', $names)); + } + // すべてque_status=1以外なので更新 + DB::table('operator_que')->whereIn('user_id', $ids) + ->update(['que_status' => 1, 'updated_at' => $now, 'operator_id' => $operatorId]); + return back()->with('success', 'ステータスをタグ未発送に変更しました。'); + } + return back()->with('error', '不正な操作です。'); + } + + // Ajax: 選択user_idのque_statusを返す(タグ発送済み/未発送判定) + public function checkStatus(Request $request) + { + $ids = $request->input('ids', []); + $type = $request->input('type'); // 'issued' or 'unissued' + $users = DB::table('user') + ->leftJoin('operator_que', 'user.user_id', '=', 'operator_que.user_id') + ->whereIn('user.user_id', $ids) + ->select('user.user_name', 'operator_que.que_status') + ->get(); + $alreadyIssued = []; + $alreadyUnissued = []; + foreach ($users as $u) { + if ($type === 'issued' && $u->que_status == 3) { + $alreadyIssued[] = $u->user_name; + } + if ($type === 'unissued' && $u->que_status == 1) { + $alreadyUnissued[] = $u->user_name; + } + } + return response()->json([ + 'alreadyIssued' => $alreadyIssued, + 'alreadyUnissued' => $alreadyUnissued + ]); + } } \ No newline at end of file diff --git a/resources/views/admin/tag_issue/list.blade.php b/resources/views/admin/tag_issue/list.blade.php index 3f7f607..985cc4c 100644 --- a/resources/views/admin/tag_issue/list.blade.php +++ b/resources/views/admin/tag_issue/list.blade.php @@ -2,129 +2,268 @@ @section('title', 'タグ発行キュー処理、履歴表示') @section('content') -
| - | キューID | -タグシリアル | -タグシリアル64進 | -タグ発送ステータス | -利用者名 | -携帯電話番号 | -自宅電話番号 | -居住所:郵便番号 | -居住所:都道府県 | -居住所:市区郡 | -居住所:住所 | -
|---|---|---|---|---|---|---|---|---|---|---|---|
| - | {{ $user->user_seq }} | -{{ $user->user_tag_serial }} | -{{ $user->user_tag_serial_64 }} | -{{ $user->user_tag_issue }} | -- {{ $user->user_name }} - | -{{ $user->user_mobile }} | -{{ $user->user_homephone }} | -{{ $user->user_regident_zip }} | -{{ $user->user_regident_pre }} | -{{ $user->user_regident_city }} | -{{ $user->user_regident_add }} | -