input('per_page', 10); $query = Machine::query(); // 搜尋:名稱或序號 if ($search = $request->input('search')) { $query->where(function ($q) use ($search) { $q->where('name', 'like', "%{$search}%") ->orWhere('serial_no', 'like', "%{$search}%"); }); } $machines = $query->when($request->status, function ($query, $status) { return $query->where('status', $status); }) ->latest() ->paginate($per_page) ->withQueryString(); return view('admin.machines.index', compact('machines')); } /** * 顯示特定機台的日誌與詳細資訊 */ public function show(int $id): View { $machine = Machine::with(['logs' => function ($query) { $query->latest()->limit(50); }])->findOrFail($id); return view('admin.machines.show', compact('machine')); } /** * 顯示所有機台日誌列表 */ public function logs(Request $request): View { $per_page = $request->input('per_page', 10); $logs = \App\Models\Machine\MachineLog::with('machine') ->when($request->level, function ($query, $level) { return $query->where('level', $level); }) ->when($request->machine_id, function ($query, $machineId) { return $query->where('machine_id', $machineId); }) ->latest() ->paginate($per_page)->withQueryString(); $machines = Machine::select('id', 'name')->get(); return view('admin.machines.logs', compact('logs', 'machines')); } /** * AJAX: 取得特定帳號的機台分配狀態 */ public function getAccountMachines(\App\Models\System\User $user) { $currentUser = auth()->user(); // 安全檢查:只能操作自己公司的帳號(除非是系統管理員) if (!$currentUser->isSystemAdmin() && $user->company_id !== $currentUser->company_id) { return response()->json(['error' => 'Unauthorized'], 403); } // 取得該公司所有機台 (限定 company_id 以實作資料隔離) $machines = Machine::where('company_id', $user->company_id) ->get(['id', 'name', 'serial_no']); $assignedIds = $user->machines()->pluck('machines.id')->toArray(); return response()->json([ 'user' => $user, 'machines' => $machines, 'assigned_ids' => $assignedIds ]); } /** * AJAX: 儲存特定帳號的機台分配 */ public function syncAccountMachines(Request $request, \App\Models\System\User $user) { $currentUser = auth()->user(); // 安全檢查 if (!$currentUser->isSystemAdmin() && $user->company_id !== $currentUser->company_id) { return response()->json(['error' => 'Unauthorized'], 403); } $request->validate([ 'machine_ids' => 'nullable|array', 'machine_ids.*' => 'exists:machines,id' ]); // 加固驗證:確保所有機台 ID 都屬於該使用者的公司 if ($request->has('machine_ids')) { $machineIds = array_unique($request->machine_ids); $validCount = Machine::where('company_id', $user->company_id) ->whereIn('id', $machineIds) ->count(); if ($validCount !== count($machineIds)) { return response()->json(['error' => 'Invalid machine IDs provided.'], 422); } } $user->machines()->sync($request->machine_ids ?? []); return response()->json([ 'success' => true, 'message' => __('Permissions updated successfully.'), 'assigned_machines' => $user->machines()->select('machines.id', 'machines.name', 'machines.serial_no')->get() ]); } /** * 機台使用率統計 (開發中) */ public function utilization(Request $request): View { return view('admin.machines.index', ['machines' => Machine::paginate(1)]); // Placeholder } /** * 機台到期管理 (開發中) */ public function expiry(Request $request): View { return view('admin.machines.index', ['machines' => Machine::paginate(1)]); // Placeholder } /** * 機台維護紀錄 (開發中) */ public function maintenance(Request $request): View { return view('admin.machines.index', ['machines' => Machine::paginate(1)]); // Placeholder } }