const others = d.langStats.filter(x=>x!==topLang).map(x=>`${(x.lang||'-').toUpperCase()} ${Math.round((x.total/total)*100)}%`).join(' • '); $('#kpiLangBreak').textContent = others; }else{ $('#kpiTopLang').textContent='-'; $('#kpiLangBreak').textContent=''; } } function updateCharts(d){ chartPerDay.data.labels = d.perDay.map(r=>r.d); chartPerDay.data.datasets[0].data = d.perDay.map(r=>Number(r.c)); chartPerDay.update(); const f = (d.foundStats.find(r=>r.result==='found')||{}).total||0; const n=(d.foundStats.find(r=>r.result==='not_found')||{}).total||0; chartFound.data.datasets[0].data = [f,n]; chartFound.update(); chartLang.data.labels = d.langStats.map(r=>r.lang||'-'); chartLang.data.datasets[0].data = d.langStats.map(r=>Number(r.total)); chartLang.update(); chartCost.data.labels = d.avgCost.map(r=>r.code); chartCost.data.datasets[0].data = d.avgCost.map(r=>Number(r.cost)); chartCost.update(); } function updateTable(d){ const tbody = $('#topTableBody'); tbody.innerHTML=''; d.topQueries.sort((a,b)=>Number(b.total)-Number(a.total)).slice(0,100).forEach((r,i)=>{ const tr = document.createElement('tr'); const pct = r.foundRate!=null? Math.round(Number(r.foundRate)*100):''; tr.innerHTML = `${i+1} ${r.query} ${fmt(r.total)} ${pct? pct+'%':''}`; tbody.appendChild(tr); }); } function exportXlsx(){ const wb = XLSX.utils.book_new(); const s1 = XLSX.utils.json_to_sheet(currentData.topQueries); XLSX.utils.book_append_sheet(wb, s1, 'TopQueries'); const s2 = XLSX.utils.json_to_sheet(currentData.perDay); XLSX.utils.book_append_sheet(wb, s2, 'PerDay'); const s3 = XLSX.utils.json_to_sheet(currentData.langStats); XLSX.utils.book_append_sheet(wb, s3, 'Lang'); const s4 = XLSX.utils.json_to_sheet(currentData.foundStats); XLSX.utils.book_append_sheet(wb, s4, 'Found'); const s5 = XLSX.utils.json_to_sheet(currentData.avgCost); XLSX.utils.book_append_sheet(wb, s5, 'AvgCost'); XLSX.writeFile(wb, `lily-report_${$('#startDate').value}_${$('#endDate').value}.xlsx`); } function setQuickRange(tag){ const t=todayStr(0); if(tag==='today'){ $('#startDate').value=t; $('#endDate').value=t; } if(tag==='7d'){ $('#startDate').value=todayStr(-7); $('#endDate').value=t; } if(tag==='30d'){ $('#startDate').value=todayStr(-30); $('#endDate').value=t; } } async function fetchStats(){ const qs = new URLSearchParams({ start: $('#startDate').value, end: $('#endDate').value, lang: $('#langSel').value, device:$('#devSel').value, ref: $('#refInput').value.trim() }); $('#statusBar').textContent='กำลังดึงข้อมูล…'; try{ const res = await fetch(`${API_BASE}/stats.php?${qs.toString()}`); const data = await res.json(); currentData = data; updateKpis(data); updateCharts(data); updateTable(data); $('#statusBar').textContent = 'อัปเดตล่าสุด: '+new Date().toLocaleString(); }catch(e){ console.error(e); $('#statusBar').textContent='ดึงข้อมูลไม่สำเร็จ'; } } // init window.addEventListener('DOMContentLoaded', ()=>{ ensureCharts(); setQuickRange('7d'); // ค่าเริ่มต้น 7 วัน document.querySelectorAll('.qbtn').forEach(b=> b.addEventListener('click', e=>{ setQuickRange(e.target.dataset.qrange); })); $('#applyBtn').addEventListener('click', fetchStats); $('#exportBtn').addEventListener('click', exportXlsx); fetchStats(); });