From e39fa8a87ee20b7194be125cfb599dbe9325ce78 Mon Sep 17 00:00:00 2001 From: "kin.rinzen" Date: Wed, 15 Oct 2025 17:43:14 +0900 Subject: [PATCH] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E4=BB=98=E3=81=8D=E3=82=A8?= =?UTF-8?q?=E3=82=AF=E3=82=B9=E3=83=9D=E3=83=BC=E3=83=88=E6=A9=9F=E8=83=BD?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Admin/PriceController.php | 100 ++++++++++-- app/Models/Price.php | 9 ++ resources/views/admin/prices/list.blade.php | 149 +++++++++--------- routes/web.php | 2 + 4 files changed, 168 insertions(+), 92 deletions(-) diff --git a/app/Http/Controllers/Admin/PriceController.php b/app/Http/Controllers/Admin/PriceController.php index d29744c..780a899 100644 --- a/app/Http/Controllers/Admin/PriceController.php +++ b/app/Http/Controllers/Admin/PriceController.php @@ -9,6 +9,7 @@ use App\Models\Pplace; use App\Models\Psection; use App\Models\Ptype; use App\Models\Usertype; +use App\Models\Station; use App\Models\Utils; use Illuminate\Support\Facades\DB; use Illuminate\Http\Request; @@ -183,6 +184,67 @@ class PriceController extends Controller return response()->download($filename, $filename, $headers)->deleteFileAfterSend(true); } + public function exportFiltered(Request $request) + { + $parkId = $request->input('park_id'); + $filename = 'price_' . $parkId . '_' . now()->format('YmdHis') . '.csv'; + + // 一時ファイル作成 + $file = fopen($filename, 'w+'); + fwrite($file, "\xEF\xBB\xBF"); // UTF-8 BOM追加 + + // CSVヘッダ + $columns = [ + '駐輪場所ID', + '商品名', + '期間', + '駐輪場ID', + '駐輪場名', + '車種区分ID', + '車種区分', + '駐輪分類ID', + '駐輪分類', + '利用者分類ID', + '利用者分類', + '駐輪車室ID', + '駐輪料金(税込)', + ]; + fputcsv($file, $columns); + + // データ取得(選択した駐輪場IDに限定) + $data = \App\Models\Price::where('price_parkplaceid', $parkId)->get(); + + foreach ($data as $item) { + fputcsv($file, [ + $item->price_parkplaceid, // 駐輪場所ID + $item->prine_name, // 商品名 + $item->price_term ?? $item->price_month, // 期間 + $item->park_id, // 駐輪場ID + optional($item->getPark())->park_name, // 駐輪場名 + $item->psection_id, // 車種区分ID + optional($item->getPSection())->psection_subject, // 車種区分 + $item->price_ptypeid, // 駐輪分類ID + optional($item->getPType())->ptype_subject, // 駐輪分類 + $item->user_categoryid, // 利用者分類ID + optional($item->getUserType())->print_name, // 利用者分類 + $item->pplace_id, // 駐輪車室ID + $item->price_taxin ?? $item->price, // 駐輪料金(税込) + ]); + } + + fclose($file); + + // ヘッダ設定 + $headers = [ + "Content-Type" => "text/csv; charset=UTF-8", + "Content-Disposition" => "attachment; filename=\"{$filename}\"", + ]; + + // ダウンロード後にファイル削除 + return response()->download($filename, $filename, $headers)->deleteFileAfterSend(true); + } + + public function import(Request $request) { $file = $request->file('file'); @@ -197,8 +259,6 @@ class PriceController extends Controller DB::beginTransaction(); try { - // 先清空数据(全置換仕様なら残す) - Price::query()->delete(); $col = 13; // CSV 項目数 foreach ($data as $key => $items) { @@ -236,22 +296,28 @@ class PriceController extends Controller $type = false; $msg = "行:{$record} 利用者分類IDが存在しません。"; break; } // TODO: 駐車車室ID チェック(pplace_id) - - // 保存 - $row = new Price(); - $row->price_parkplaceid = $items[0]; - $row->prine_name = $items[1]; - $row->price_month = $items[2]; - $row->park_id = $items[3]; - $row->psection_id = $items[5]; - $row->price_ptypeid = $items[7]; - $row->user_categoryid = $items[9]; - $row->pplace_id = $items[11]; - $row->price = $items[12]; - - if (!$row->save()) { - $type = false; $msg = "行:{$record} データ保存に失敗しました。"; break; + if (!Pplace::where('pplace_id', $items[11])->exists()) { + $type = false; $msg = "行:{$record} 駐車車室IDが存在しません。"; break; } + + // 保存(存在すれば更新、なければ新規作成) + Price::updateOrCreate( + ['price_parkplaceid' => $items[0]], // 主キー条件(存在チェック) + + [ + 'prine_name' => $items[1], + 'price_month' => $items[2], + 'park_id' => $items[3], + 'psection_id' => $items[5], + 'price_ptypeid' => $items[7], + 'user_categoryid' => $items[9], + 'pplace_id' => $items[11], + 'price' => $items[12], + 'operator_id' => auth()->user()->operator_id ?? null, // オプション + 'updated_at' => now(), + 'created_at' => now(), + ] + ); } } catch (\Exception $e) { $type = false; diff --git a/app/Models/Price.php b/app/Models/Price.php index 50faa40..6e51eb1 100644 --- a/app/Models/Price.php +++ b/app/Models/Price.php @@ -125,6 +125,15 @@ class Price extends Model return $this->belongsTo(Ptype::class, 'price_ptypeid'); // 外部キーが price_ptypeid } + public function pplace() + { + return $this->belongsTo(Pplace::class, 'pplace_id'); // 外部キーが pplace_id + + } + // public function getStation() + // { + // return $this->belongsTo(Station::class, 'price_parkplaceid', 'park_id'); + // } diff --git a/resources/views/admin/prices/list.blade.php b/resources/views/admin/prices/list.blade.php index b6dfa9a..45f70f6 100644 --- a/resources/views/admin/prices/list.blade.php +++ b/resources/views/admin/prices/list.blade.php @@ -61,31 +61,31 @@ {{-- エクスポート用モーダル --}}