upload project flutter

This commit is contained in:
Kharisma 2026-07-02 13:55:02 +07:00
parent 036a3543ed
commit 6a2f130e3a
1 changed files with 61 additions and 31 deletions

View File

@ -81,6 +81,10 @@ function toDate(value) {
}
function normalizeKandangKey(kandangId, kandangNama) {
const name = String(kandangNama || '').toLowerCase();
if (name.includes('kandang 1') || name.includes('kandang1') || name.includes('kandang_1')) return 'kandang1';
if (name.includes('kandang 2') || name.includes('kandang2') || name.includes('kandang_2')) return 'kandang2';
const rawId = String(kandangId || '').toLowerCase();
const rawNama = String(kandangNama || '').toLowerCase();
const merged = `${rawId} ${rawNama}`;
@ -136,27 +140,53 @@ function resolveTargetKandangIds(jadwal, kandangMap) {
}
function detectJenisPanen(jadwal, jadwalOrder) {
// jadwalOrder 0 = urutan pertama = PAGI
// jadwalOrder 1+ = urutan selanjutnya = SORE (atau sesuai jam)
// Prioritas 1: baca langsung dari Firebase
const tipe = String(
jadwal.tipeJadwal ||
jadwal.tipe_jadwal ||
jadwal.keterangan ||
''
)
.toLowerCase()
.trim();
if (tipe.includes('pagi')) {
return 'pagi';
}
if (tipe.includes('sore')) {
return 'sore';
}
// Fallback untuk data lama
if (jadwalOrder === 0) {
return 'pagi';
}
// Untuk jadwal ke-2+, check jam: < 12 = pagi, >= 12 = sore
const jam = String(jadwal.jam || '09:00');
const hour = Number(jam.split(':')[0] || 9);
return hour < 12 ? 'pagi' : 'sore';
return 'sore';
}
function resolveInfraPath(kandangId, kandangData) {
if (kandangData && kandangData.infraPath) {
return String(kandangData.infraPath);
const path = String(kandangData.infraPath).toLowerCase();
if (path.includes('2')) return 'infra2';
if (path.includes('1')) return 'infra1';
return path;
}
if (kandangData && kandangData.nama) {
const nama = String(kandangData.nama).toLowerCase();
if (nama.includes('2') || nama.includes('dua')) return 'infra2';
if (nama.includes('1') || nama.includes('satu')) return 'infra1';
}
const id = String(kandangId || '').toLowerCase();
if (id.includes('1')) return 'infra1';
if (id.length < 15) {
if (id.includes('2')) return 'infra2';
if (id.includes('1')) return 'infra1';
}
return 'infra1';
}
@ -211,11 +241,11 @@ async function updateRiwayatSummary({ kandangId, kandangNama, jumlahTelur, dateK
});
}
async function resetSensorAfterEvening(todayKey) {
const lockKey = 'evening_sensor_reset';
async function resetSensorAfterEvening(todayKey, nowHHMM) {
const lockKey = `evening_sensor_reset_${nowHHMM.replace(':', '')}`;
const gotLock = await acquireRunLock(todayKey, lockKey);
if (!gotLock) {
console.log('[skip] Sensor reset sudah dieksekusi hari ini');
console.log('[skip] Sensor & snapshot reset sudah dieksekusi untuk menit ini');
return;
}
@ -225,7 +255,14 @@ async function resetSensorAfterEvening(todayKey) {
last_reset_by_scheduler: new Date().toISOString(),
});
console.log('[ok] Sensor infra1/infra2 di-reset otomatis setelah jadwal sore');
// PERINTAH RESET KE ESP32
await admin.database().ref('kontrol').update({
reset_counter: true
});
await admin.database().ref(`panen_snapshot/${todayKey}`).remove();
console.log('[ok] Sensor infra1/infra2 dan snapshot panen di-reset otomatis setelah jadwal sore');
}
async function writeRiwayat({
@ -523,10 +560,10 @@ async function runForSchedule(jadwalId, jadwal, dataSensor, kandangMap, todayKey
}
for (const kandangId of targetKandangIds) {
const lockKey = `${jenisPanen}_${kandangId}`;
const lockKey = `${jenisPanen}_${kandangId}_${jam.replace(/:/g, '')}`;
const gotLock = await acquireRunLock(todayKey, lockKey);
if (!gotLock) {
console.log(`[skip] ${jadwalId}/${kandangId}: slot ${jenisPanen} sudah dieksekusi hari ini`);
console.log(`[skip] ${jadwalId}/${kandangId}: slot ${jenisPanen} pada jam ${jam} sudah dieksekusi hari ini`);
continue;
}
@ -562,7 +599,7 @@ async function runForSchedule(jadwalId, jadwal, dataSensor, kandangMap, todayKey
const pagiSnapRef = admin.database().ref(`panen_snapshot/${todayKey}/pagi/${kandangId}`);
const pagiSnap = await pagiSnapRef.get();
const nilaiPagi = pagiSnap.exists() ? Number(pagiSnap.val() || 0) : 0;
const delta = Math.max(sensorValue - nilaiPagi, 0);
const delta = sensorValue >= nilaiPagi ? (sensorValue - nilaiPagi) : sensorValue;
await admin.database().ref(`panen_snapshot/${todayKey}/sore`).update({
[kandangId]: sensorValue,
@ -584,13 +621,6 @@ async function runForSchedule(jadwalId, jadwal, dataSensor, kandangMap, todayKey
console.log(`[ok] Sore ${kandangNama}: ${delta} telur (${sensorValue}-${nilaiPagi})`);
}
// Jika ini jadwal terakhir, reset snapshot untuk hari ini
if (jadwalOrder === totalJadwal - 1) {
const snapshotRef = admin.database().ref(`panen_snapshot/${todayKey}`);
await snapshotRef.remove();
console.log(`[ok] Reset snapshot panen untuk hari ${todayKey} (jadwal terakhir selesai)`);
}
}
async function runTick() {
@ -655,7 +685,7 @@ async function runTick() {
}
if (hasEveningRun) {
await resetSensorAfterEvening(todayKey);
await resetSensorAfterEvening(todayKey, nowHHMM);
}
}