const siloRows = ; const hammaddeFields = ; const besinData = ; const fieldMapping = ; function createHammaddeTable(){ let html = `

Silolar (Hammaddeler)

`; hammaddeFields.forEach(field => { html += ``; }); html += ``; siloRows.forEach((row, idx) => { html += ``; hammaddeFields.forEach(field => { const val = parseFloat(row[field.key] || 0); html += ``; }); html += ``; }); html += `
# Silo Min (%) Max (%) Fiyat (TL/kg) Çözüm (%) Ton${field.label}
${idx+1} ${row.silo}
`; document.getElementById('hammaddeContainer').innerHTML = html; } function createBesinTable(){ let html = `

Besin Maddeleri

`; Object.keys(besinData).forEach(id => { const b = besinData[id]; html += ``; }); html += `
ID Besin Adı Min Max Gerçekleşen
${id} ${b.ad} 0
`; document.getElementById('besinContainer').innerHTML = html; } function recalcNutrients(){ Object.keys(besinData).forEach(bID => { let total = 0, sumSolution = 0; const colKey = fieldMapping[bID]; if(!colKey) return; siloRows.forEach((row, idx) => { const solPercent = parseFloat(document.getElementById(`h${idx}_solution`).value) || 0; const val = parseFloat(document.getElementById(`h${idx}_${colKey}`).value) || 0; total += solPercent * val; sumSolution += solPercent; }); let actualVal = (sumSolution > 0) ? total / sumSolution : 0; document.getElementById(`b${bID}_actual`).textContent = actualVal.toFixed(2); }); } function manualSolutionChange(){ recalcNutrients(); updateTotalSolution(); updateTotalCost(); updateTonSolutions(); } function updateTotalCost() { let totalCost = 0; siloRows.forEach((_, i) => { const cost = parseFloat(document.getElementById(`h${i}_cost`).value) || 0; const sol = parseFloat(document.getElementById(`h${i}_solution`).value) || 0; totalCost += cost * sol; }); document.getElementById('solutionStatus').innerHTML = 'Toplam Maliyet = ' + totalCost.toFixed(2) + ' TL'; } function updateTotalSolution(){ let sum = 0; siloRows.forEach((_, idx) => { sum += parseFloat(document.getElementById(`h${idx}_solution`).value) || 0; }); document.getElementById('totalSolution').textContent = sum.toFixed(2); } function updateTonSolutions(){ let target = parseFloat(document.getElementById('scalingInput').value) || 100; let totalSolution = 0; siloRows.forEach((_, idx) => { totalSolution += parseFloat(document.getElementById(`h${idx}_solution`).value) || 0; }); siloRows.forEach((_, idx) => { let solVal = parseFloat(document.getElementById(`h${idx}_solution`).value) || 0; let tonVal = (totalSolution > 0) ? (solVal / totalSolution) * target : 0; document.getElementById(`h${idx}_ton`).value = tonVal.toFixed(2); }); updateTotalTonSolution(); } function updateTotalTonSolution(){ let sumTon = 0; siloRows.forEach((_, idx) => { sumTon += parseFloat(document.getElementById(`h${idx}_ton`).value) || 0; }); document.getElementById('totalScaledSolution').textContent = sumTon.toFixed(2); } function animateSolutionMessage(message, color) { let solutionStatus = document.getElementById('solutionStatus'); solutionStatus.innerHTML = `${message}`; let solutionText = document.getElementById('solutionText'); solutionText.style.transition = "transform 0.2s ease-in-out"; solutionText.style.transform = "scale(1.5)"; setTimeout(() => { solutionText.style.transform = "scale(1)"; }, 500); } // Solver çözüm sağladıktan sonra bu fonksiyonu çağır function solveLP(){ let model = { optimize: "cost", opType: "min", constraints: {}, variables: {} }; let selectedPercent = parseFloat(document.getElementById("percentSelect").value); model.constraints.sumPct = { equal: selectedPercent }; let activeIndices = []; siloRows.forEach((row, i) => { let maxVal = parseFloat(document.getElementById(`h${i}_max`).value); if(maxVal > 0){ activeIndices.push(i); } else { document.getElementById(`h${i}_solution`).value = "0.00"; model.constraints[`silo${i}_lower`] = { min: 0 }; model.constraints[`silo${i}_upper`] = { max: 0 }; } }); activeIndices.forEach(i => { const minVal = parseFloat(document.getElementById(`h${i}_min`).value) || 0; const maxVal = parseFloat(document.getElementById(`h${i}_max`).value) || 100; model.constraints[`silo${i}_lower`] = { min: minVal }; model.constraints[`silo${i}_upper`] = { max: maxVal }; const varName = `silo_${i}`; const costVal = parseFloat(document.getElementById(`h${i}_cost`).value) || 1; let variableDef = { cost: costVal, sumPct: 1 }; variableDef[`silo${i}_lower`] = 1; variableDef[`silo${i}_upper`] = 1; Object.keys(besinData).forEach(bID => { const colKey = fieldMapping[bID]; if(!colKey) return; const val = parseFloat(document.getElementById(`h${i}_${colKey}`).value) || 0; variableDef[`nutrient${bID}_min`] = val; variableDef[`nutrient${bID}_max`] = val; }); model.variables[varName] = variableDef; }); Object.keys(besinData).forEach(bID => { const bMin = parseFloat(document.getElementById(`b${bID}_min`).value) || 0; const bMax = parseFloat(document.getElementById(`b${bID}_max`).value) || 999999; model.constraints[`nutrient${bID}_min`] = { min: bMin * selectedPercent }; model.constraints[`nutrient${bID}_max`] = { max: bMax * selectedPercent }; }); let results = solver.Solve(model); if (!results.feasible) { animateSolutionMessage("Çözüm Sağlanamadı (Çözümsüz)", "red"); return; } activeIndices.forEach(i => { const varName = `silo_${i}`; const val = results[varName] ? results[varName] : 0; document.getElementById(`h${i}_solution`).value = val.toFixed(2); }); recalcNutrients(); updateTotalSolution(); updateTonSolutions(); animateSolutionMessage(`Çözüm Sağlandı. Toplam Maliyet = ${results.result.toFixed(2)} TL`, "blue"); } function toggleColumns(){ const cols = document.querySelectorAll('.toggle-col'); cols.forEach(col => { col.style.display = (col.style.display === 'none' || col.style.display === '') ? 'table-cell' : 'none'; }); } function updateMaxInputs(){ let selectedValue = document.getElementById('percentSelect').value; siloRows.forEach((row, idx) => { let maxInput = document.getElementById(`h${idx}_max`); if(maxInput) { maxInput.value = selectedValue; } }); } function saveData(){ if(!confirm("Kaydetmek istediğinize emin misiniz?")) return; const name = prompt("Kaydetmek için isim giriniz:"); if(!name) return; let data = {}; document.querySelectorAll('input[type="number"]').forEach(input => { data[input.id] = input.value; }); data["percentSelect"] = document.getElementById("percentSelect").value; Object.keys(besinData).forEach(id => { data["b" + id + "_actual"] = document.getElementById("b" + id + "_actual").textContent; }); fetch('?action=save_config', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ name, data }) }) .then(res => res.json()) .then(resp => { alert(resp.message); loadConfigs(); }); } function deleteConfig(){ const id = document.getElementById('configSelect').value; if(!id) { alert("Lütfen silinecek kaydı seçin."); return; } if(!confirm("Kaydı silmek istediğinize emin misiniz?")) return; fetch('?action=delete_config&id=' + id) .then(res => res.json()) .then(resp => { alert(resp.message); loadConfigs(); }); } function loadConfigs(){ fetch('?action=get_configs') .then(res => res.json()) .then(configs => { const sel = document.getElementById('configSelect'); sel.innerHTML = ''; configs.forEach(conf => { let opt = document.createElement('option'); opt.value = conf.id; opt.textContent = conf.name; sel.appendChild(opt); }); }); } function loadData(){ const id = document.getElementById('configSelect').value; if(!id) return; fetch('?action=load_config&id=' + id) .then(res => res.json()) .then(resp => { if(resp.data){ let percent = parseInt(resp.data.percentSelect); document.getElementById("percentSelect").value = percent; document.getElementById("scalingInput").value = resp.data.scalingInput; for(let key in resp.data){ if(key === "percentSelect" || key === "scalingInput") continue; let inp = document.getElementById(key); if(inp) inp.value = resp.data[key]; } recalcNutrients(); updateTotalSolution(); updateTonSolutions(); } }); } function washStock() { if (!confirm("Yıkama yapmak istediğinize emin misiniz?")) return; let data = []; siloRows.forEach((row, idx) => { let tonVal = parseFloat(document.getElementById(`h${idx}_ton`).value) || 0; let siloName = row.silo; data.push({ silo: siloName, ton: tonVal }); }); fetch('?action=wash_stock', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ data: data }) }) .then(res => res.json()) .then(resp => { alert(resp.message); // Wash_log.php entegrasyonu let configId = document.getElementById('configSelect').value || 0; fetch('wash_log.php?config_id=' + configId) .then(res => res.json()) .then(logResp => { console.log(logResp.message); }); }); } window.onload = () => { createHammaddeTable(); createBesinTable(); recalcNutrients(); updateTotalSolution(); updateTonSolutions(); loadConfigs(); // Tüm inputları text olarak değiştir document.querySelectorAll('input').forEach(input => { input.type = "text"; }); };