93 lines
4.3 KiB
Markdown
93 lines
4.3 KiB
Markdown
# Perbaikan Sistem Panen - Dokumentasi Perubahan
|
|
|
|
## Masalah yang Diperbaiki
|
|
|
|
Sebelumnya, sistem panen menunjukkan duplikasi entry riwayat saat hari yang sama:
|
|
- Contoh: Jadwal sore jam 14:34 menghasilkan capture di 14:34 DAN 15:00
|
|
- Akar masalah: Flutter runtime scheduler hardcoded untuk trigger di jam 15:00 secara otomatis, terlepas dari jadwal aktif
|
|
|
|
## Perubahan yang Dilakukan
|
|
|
|
### 1. Worker Railway (`railway-scheduler/worker.js`)
|
|
**Perubahan klasifikasi pagi/sore:**
|
|
- Sebelum: Cek keterangan jadwal ("sore", "pagi")
|
|
- Sesudah: Hanya lihat jam - jika `jam < 12` = pagi, jika `jam >= 12` = sore
|
|
|
|
**Perubahan locking eksekusi:**
|
|
- Sebelum: Lock key = `jadwalId_jenisPanen_kandangId` (per jadwal)
|
|
- Sesudah: Lock key = `jenisPanen_kandangId` (per slot)
|
|
- Akibat: Satu slot pagi/sore per kandang per hari hanya jalan 1x, tidak peduli berapa jadwal cocok
|
|
|
|
### 2. Flutter Runtime Scheduler (`lib/services/panen_runtime_scheduler_service.dart`)
|
|
**Perubahan deteksi jadwal:**
|
|
- Sebelum: Default jam pagi 09:00 dan sore 15:00, cari jadwal yang cocok untuk override
|
|
- Sesudah: Cari jadwal aktif, ambil jam pagi dan sore HANYA jika ada jadwal untuk slot itu
|
|
- Akibat: Jika tidak ada jadwal sore, capture sore tidak akan trigger (tidak hardcoded 15:00)
|
|
|
|
**Perubahan trigger window:**
|
|
- Sebelum: Selalu trigger pagi di jam 09:00-09:10 dan sore di jam 15:00-15:10
|
|
- Sesudah: Hanya trigger jika jadwal aktif untuk slot itu (null check)
|
|
|
|
### 3. Flutter Panen Provider (`lib/providers/panen_provider.dart`)
|
|
**Perubahan klasifikasi jenis panen:**
|
|
- Sebelum: Hardcoded untuk jam 09 = pagi, jam 15 = sore
|
|
- Sesudah: Parse jam, jika hour < 12 = pagi, hour >= 12 = sore
|
|
- Akibat: Sistem konsisten dengan worker, hitung delta sore dengan benar
|
|
|
|
## Cara Kerja Sistem Sekarang
|
|
|
|
```
|
|
┌─────────────────────────────────────────────────────┐
|
|
│ Jadwal Aktif: Kandang Global │
|
|
│ Pagi: Jam 09:00 | Sore: Jam 14:34 (Misal) │
|
|
└────────────────────┬────────────────────────────────┘
|
|
│
|
|
┌────────────┴───────────┐
|
|
▼ ▼
|
|
WORKER RAILWAY FLUTTER APP
|
|
(Production) (Backup/Manual)
|
|
│ │
|
|
Setiap menit: Setiap 30 detik:
|
|
- Cek jadwal aktif - Cek jadwal aktif
|
|
- Jika jam cocok - Jika jam cocok
|
|
- LOCK SLOT (pagi/sore) - Trigger capture
|
|
- Capture ke Firebase - Simpan jika belum
|
|
│ │
|
|
└────────────┬───────────┘
|
|
▼
|
|
Firebase /riwayat/records
|
|
(1 entry per slot per kandang per hari)
|
|
```
|
|
|
|
## Skenario Sebelum vs Sesudah
|
|
|
|
### Skenario: Jadwal 1 Pagi 09:00 + Sore 14:34
|
|
|
|
**SEBELUM:**
|
|
- Pukul 09:00: Worker trigger capture pagi ✅ Kandang1: 100, Kandang2: 100
|
|
- Pukul 14:34: Worker trigger capture sore ✅ Kandang1: 20 (delta: 120-100), Kandang2: 20
|
|
- Pukul 15:00: Flutter trigger capture sore ❌ Kandang1: 0, Kandang2: 0 (DUPLIKASI!)
|
|
- Total riwayat hari ini: 6 entry (3 per kandang)
|
|
|
|
**SESUDAH:**
|
|
- Pukul 09:00: Worker trigger capture pagi ✅ Kandang1: 100, Kandang2: 100
|
|
- Pukul 14:34: Worker trigger capture sore ✅ Kandang1: 20 (delta: 120-100), Kandang2: 20
|
|
- Pukul 15:00: Flutter cek jadwal - tidak ada jadwal di 15:00 ❌ SKIP
|
|
- Total riwayat hari ini: 4 entry (2 per kandang) ✅
|
|
|
|
## Testing Checklist
|
|
|
|
- [ ] Buat jadwal pagi jam 09:00 + sore jam 14:34
|
|
- [ ] Cek riwayat hari ini - harus ada 2 entry per kandang (pagi + sore)
|
|
- [ ] Cek jam panen - pagi di 09:00, sore di 14:34 (bukan 15:00)
|
|
- [ ] Cek nilai sore = sensor_sekarang - nilai_pagi
|
|
- [ ] Tunggu 24 jam, cek apakah snapshot direset otomatis di tengah malam
|
|
|
|
## Catatan
|
|
|
|
- Jika ada jadwal HANYA sore (tanpa pagi), capture pagi tidak akan trigger
|
|
- Jika ada jadwal HANYA pagi (tanpa sore), capture sore tidak akan trigger
|
|
- Saat ini sistem SETARA antara Worker Railway dan Flutter Runtime Scheduler
|
|
- Kalau kedua trigger di waktu bersamaan, Firebase lock akan mencegah duplikasi
|
|
- Lock lebih dipercaya ke worker (production), Flutter hanya fallback
|