krgm.so-manager-dev.com/app/Http/Controllers/Admin/PplaceController.php
kin.rinzen 0498760d46
All checks were successful
Deploy main / deploy (push) Successful in 22s
画面修正
2025-10-28 13:58:45 +09:00

228 lines
6.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Pplace;
use App\Models\Ope;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Validator;
use Response;
class PplaceController extends Controller
{
public function list(Request $request)
{
$inputs = [
'isExport' => 0,
'sort' => $request->input('sort', ''),
'sort_type' => $request->input('sort_type', ''),
'page' => $request->get('page', 1),
];
$inputs['list'] = Pplace::search($inputs);
if ($inputs['list']->total() > 0 && $inputs['page'] > $inputs['list']->lastPage()) {
return redirect()->route('pplaces');
}
return view('admin.pplace.list', $inputs);
}
/**
* 新規登録(画面/処理)
*/
public function add(Request $request)
{
if ($request->isMethod('get')) {
// 新規時:空のレコードとオペレーターリストを渡す
return view('admin.pplace.add', [
'isEdit' => false,
'record' => new Pplace(),
'operators' => Ope::getList(),
]);
}
// POST時バリデーション
$rules = [
'pplace_number' => 'required|string|max:255',
'pplace_remarks' => 'nullable|string|max:255',
'operator_id' => 'nullable|integer',
];
$messages = [
'pplace_number.required' => '駐輪場所番号は必須です。',
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput()
->with(['operators' => Ope::getList()]);
}
// トランザクションで登録処理
DB::transaction(function () use ($request) {
$new = new Pplace();
$new->fill($request->only(['pplace_number', 'pplace_remarks', 'operator_id']));
$new->save();
});
return redirect()->route('pplaces')->with('success', '登録しました。');
}
/**
* 編集(画面/処理)
*/
public function edit(Request $request, $id)
{
// 該当データ取得
$record = Pplace::find($id);
if (!$record) {
abort(404);
}
// オペレーターリスト取得(常に渡す)
$operators = Ope::getList();
if ($request->isMethod('get')) {
// 編集画面表示
return view('admin.pplace.edit', [
'isEdit' => true,
'record' => $record,
'operators' => $operators,
]);
}
// POST時バリデーション
$rules = [
'pplace_number' => 'required|string|max:255',
'pplace_remarks' => 'nullable|string|max:255',
'operator_id' => 'nullable|integer',
];
$messages = [
'pplace_number.required' => '駐輪場所番号は必須です。',
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return redirect()->back()
->withErrors($validator)
->withInput()
->with(['operators' => $operators]);
}
// 更新処理
DB::transaction(function () use ($request, $record) {
$record->fill($request->only(['pplace_number', 'pplace_remarks', 'operator_id']));
$record->save();
});
return redirect()->route('pplaces')->with('success', '更新しました。');
}
/**
* 削除(単一/複数対応)
*/
public function delete(Request $request)
{
$ids = [];
// 単一削除id
if ($request->filled('id')) {
$ids[] = (int) $request->input('id');
}
// 複数削除(チェックボックス pk[]
if (is_array($request->input('pk'))) {
$ids = array_merge($ids, $request->input('pk'));
}
// 重複除去 & 数値変換
$ids = array_values(array_unique(array_map('intval', $ids)));
// 対象未選択
if (empty($ids)) {
return back()->with('error', '削除対象が選択されていません。');
}
// 削除実行
Pplace::whereIn('pplace_id', $ids)->delete();
return redirect()->route('pplaces')->with('success', '削除しました。');
}
public function export()
{
$filename = '駐輪車室マスタ' . now()->format('YmdHis') . '.csv';
$file = fopen($filename, 'w+');
fwrite($file, "\xEF\xBB\xBF"); // BOM追加UTF-8
$columns = ['駐輪車室ID', '番号', '備考', 'オペレータID'];
fputcsv($file, $columns);
$data = Pplace::all();
foreach ($data as $item) {
fputcsv($file, [
$item->pplace_id,
$item->pplace_number,
$item->pplace_remarks,
$item->operator_id,
]);
}
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');
if (!$file) {
return redirect()->route('pplaces')->with('error', 'CSVファイルを選択してください');
}
$data = \App\Utils::csvToArray($file);
$record = 0;
DB::beginTransaction();
try {
foreach ($data as $key => $row) {
$record = $key + 2;
if (count($row) < 3) throw new \Exception('列数が不正です');
Pplace::create([
'pplace_number' => $row[0],
'pplace_remarks' => $row[1],
'operator_id' => $row[2],
]);
}
DB::commit();
return redirect()->route('pplaces')->with('success', 'インポート成功');
} catch (\Exception $e) {
DB::rollBack();
return redirect()->route('pplaces')->with('error', "{$record} : " . $e->getMessage());
}
}
private function __buildErrorMessasges($validator)
{
return implode("\n", $validator->errors()->all());
}
}