From 822b613cb13935b131ee7eb9336dfb1bc2bf3c64 Mon Sep 17 00:00:00 2001 From: rendygaafk Date: Mon, 19 May 2025 03:16:43 +0700 Subject: [PATCH] fix send nama ruang --- .../Controllers/AnnouncementController.php | 84 ++++++++++++++----- .../Requests/StoreAnnouncementRequest.php | 4 +- .../admin/announcement/history.blade.php | 7 +- .../views/admin/announcement/index.blade.php | 52 ++++++------ routes/web.php | 2 + 5 files changed, 95 insertions(+), 54 deletions(-) diff --git a/app/Http/Controllers/AnnouncementController.php b/app/Http/Controllers/AnnouncementController.php index 491cda0..c029f99 100644 --- a/app/Http/Controllers/AnnouncementController.php +++ b/app/Http/Controllers/AnnouncementController.php @@ -46,9 +46,9 @@ public function history() ->when(request('date'), function($query, $date) { return $query->whereDate('sent_at', $date); }) - ->when(request('ruangan'), function($query, $ruanganId) { - return $query->whereHas('ruangans', function($q) use ($ruanganId) { - $q->where('ruangan.id', $ruanganId); + ->when(request('ruangan'), function($query, $ruanganName) { + return $query->whereHas('ruangans', function($q) use ($ruanganName) { + $q->where('nama_ruangan', $ruanganName); // Filter by name }); }) ->orderBy('sent_at', 'desc') @@ -74,6 +74,25 @@ public function store(StoreAnnouncementRequest $request) DB::beginTransaction(); try { + // 1. Konversi nama ruangan ke ID + $ruanganNames = $request->ruangans; + $ruanganRecords = Ruangan::whereIn('nama_ruangan', $ruanganNames)->get(); + + // Validasi semua nama ruangan ditemukan + if ($ruanganRecords->count() !== count($ruanganNames)) { + $missingRooms = array_diff( + $ruanganNames, + $ruanganRecords->pluck('nama_ruangan')->toArray() + ); + + throw new \Exception( + 'Ruangan tidak ditemukan: ' . implode(', ', $missingRooms) + ); + } + + $ruanganIds = $ruanganRecords->pluck('id')->toArray(); + + // 2. Persiapkan data pengumuman $announcementData = [ 'mode' => $request->mode, 'sent_at' => now(), @@ -83,47 +102,57 @@ public function store(StoreAnnouncementRequest $request) $announcementData['message'] = $request->message; } + // 3. Simpan pengumuman dan relasinya $announcement = Announcement::create($announcementData); - $announcement->ruangans()->sync($request->ruangans); + $announcement->ruangans()->sync($ruanganIds); + // 4. Kirim perintah ke MQTT $mqttService = app(MqttService::class); + $success = false; if ($request->mode === self::MODE_TTS) { $success = $mqttService->sendTTSAnnouncement( - $request->ruangans, + $ruanganNames, // Kirim nama ruangan (bukan ID) $request->message ); } else { $success = $mqttService->sendRelayControl( - 'activate', // Default action for announcements - $request->ruangans, + self::ACTION_ACTIVATE, + $ruanganNames, // Kirim nama ruangan (bukan ID) $request->mode ); } if (!$success) { - throw new \Exception('Gagal mengirim perintah ke perangkat'); + throw new \Exception('Gagal mengirim perintah ke perangkat MQTT'); } DB::commit(); return response()->json([ 'success' => true, - 'message' => 'Pengumuman berhasil dikirim' + 'message' => 'Pengumuman berhasil dikirim', + 'data' => [ + 'announcement_id' => $announcement->id, + 'ruangan' => $ruanganNames + ] ]); } catch (\Exception $e) { DB::rollBack(); - Log::error('Failed to store announcement: ' . $e->getMessage()); + Log::error('Failed to store announcement', [ + 'error' => $e->getMessage(), + 'request' => $request->all() + ]); return response()->json([ 'success' => false, - 'message' => 'Gagal mengirim pengumuman: ' . $e->getMessage() + 'message' => 'Gagal mengirim pengumuman: ' . $e->getMessage(), + 'error_details' => $e->getMessage() ], 500); } } - public function details($id) { try { @@ -196,7 +225,7 @@ public function controlRelay(Request $request) { $validated = $request->validate([ 'ruangans' => 'required|array|min:1', - 'ruangans.*' => 'exists:ruangan,id', + 'ruangans.*' => 'string|exists:ruangan,nama_ruangan', // Pastikan validasi string 'action' => 'required|in:'.self::ACTION_ACTIVATE.','.self::ACTION_DEACTIVATE, 'mode' => 'required|in:'.self::MODE_MANUAL.','.self::MODE_TTS ]); @@ -204,13 +233,15 @@ public function controlRelay(Request $request) DB::beginTransaction(); try { - $state = $validated['action'] === self::ACTION_ACTIVATE ? 'on' : 'off'; - $ruanganIds = $validated['ruangans']; + // Dapatkan ID untuk operasi database + $ruanganIds = Ruangan::whereIn('nama_ruangan', $validated['ruangans']) + ->pluck('id') + ->toArray(); $mqttService = app(MqttService::class); $success = $mqttService->sendRelayControl( $validated['action'], - $ruanganIds, + $validated['ruangans'], // Kirim NAMA ruangan ke MQTT $validated['mode'] ); @@ -218,10 +249,11 @@ public function controlRelay(Request $request) throw new \Exception('Gagal mengirim perintah ke perangkat'); } - // Update database + // Update database menggunakan ID + $state = $validated['action'] === self::ACTION_ACTIVATE ? 'on' : 'off'; Ruangan::whereIn('id', $ruanganIds)->update(['relay_state' => $state]); - // Log manual activations as announcements + // Log manual activations if ($validated['action'] === self::ACTION_ACTIVATE && $validated['mode'] === self::MODE_MANUAL) { $announcement = Announcement::create([ 'mode' => self::MODE_MANUAL, @@ -229,14 +261,15 @@ public function controlRelay(Request $request) 'sent_at' => now() ]); - $announcement->ruangans()->sync($ruanganIds); + $announcement->ruangans()->sync($ruanganIds); // Gunakan ID untuk relasi } DB::commit(); return response()->json([ 'success' => true, - 'message' => 'Relay berhasil dikontrol' + 'message' => 'Relay berhasil dikontrol', + 'ruangans' => $validated['ruangans'] // Kembalikan nama ruangan ]); } catch (\Exception $e) { @@ -253,11 +286,16 @@ public function controlRelay(Request $request) public function relayStatus() { try { - $ruangans = Ruangan::select('id', 'nama_ruangan', 'relay_state')->get(); + $ruangans = Ruangan::select('nama_ruangan', 'relay_state')->get(); // Hanya ambil nama dan status return response()->json([ 'success' => true, - 'data' => $ruangans + 'data' => $ruangans->map(function($ruangan) { + return [ + 'nama_ruangan' => $ruangan->nama_ruangan, + 'relay_state' => $ruangan->relay_state + ]; + }) ]); } catch (\Exception $e) { @@ -274,7 +312,7 @@ public function announcementStatus(Request $request) try { $request->validate([ 'ruangans' => 'required|array|min:1', - 'ruangans.*' => 'exists:ruangan,id' + 'ruangans.*' => 'exists:ruangan,nama_ruangan' ]); $mqttService = app(MqttService::class); diff --git a/app/Http/Requests/StoreAnnouncementRequest.php b/app/Http/Requests/StoreAnnouncementRequest.php index 7b89e86..0bd95f7 100644 --- a/app/Http/Requests/StoreAnnouncementRequest.php +++ b/app/Http/Requests/StoreAnnouncementRequest.php @@ -14,10 +14,10 @@ public function authorize() public function rules() { return [ - 'message' => 'required|string|max:500', + 'message' => 'required_if:mode,tts|string|max:500', 'mode' => 'required|in:tts,manual', 'ruangans' => 'required|array|min:1', - 'ruangans.*' => 'exists:ruangan,id', + 'ruangans.*' => 'string|exists:ruangan,nama_ruangan', // Ubah validasi ke nama ruangan ]; } diff --git a/resources/views/admin/announcement/history.blade.php b/resources/views/admin/announcement/history.blade.php index e9ca44d..4578696 100644 --- a/resources/views/admin/announcement/history.blade.php +++ b/resources/views/admin/announcement/history.blade.php @@ -199,7 +199,8 @@ class="inline-flex items-center px-3 py-1.5 border border-transparent text-sm fo