const siloRows = ;
const hammaddeFields = ;
const besinData = ;
const fieldMapping = ;
function createHammaddeTable(){
let html = `
Silolar (Hammaddeler)
`;
document.getElementById('hammaddeContainer').innerHTML = html;
}
function createBesinTable(){
let html = `Besin Maddeleri
`;
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";
});
};