TKK_E32231105/PERBAIKAN_SISTEM_PANEN.md

4.3 KiB

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