diff --git a/public/js/stats.js b/public/js/stats.js index a694cdc..0ec6f8b 100644 --- a/public/js/stats.js +++ b/public/js/stats.js @@ -1,22 +1,42 @@ async function loadStats() { try { - const res = await fetch(API + '/api/stats/monthly?year=' + currentYear + '&month=' + currentMonth, { headers: headers() }); - if (!res.ok) return; - const s = await res.json(); - document.getElementById('takeCount').textContent = s.take_order_count; - document.getElementById('dispatchCount').textContent = s.dispatch_order_count; - document.getElementById('takeIncome').textContent = '' + s.take_order_income.toFixed(2); - document.getElementById('dispatchIncome').textContent = '' + s.dispatch_order_income.toFixed(2); - document.getElementById('redEnvelopeCount').textContent = s.redEnvelope_count || 0; - document.getElementById('redEnvelopeIncome').textContent = '' + (s.redEnvelope_income || 0).toFixed(2); - document.getElementById('milkTeaCount').textContent = s.milkTea_count || 0; - document.getElementById('milkTeaIncome').textContent = '' + (s.milkTea_income || 0).toFixed(2); - document.getElementById('totalIncome').textContent = '' + s.total_income.toFixed(2); - document.getElementById('totalExpense').textContent = '' + s.total_expense.toFixed(2); - document.getElementById('netIncome').textContent = '' + (s.total_income - s.total_expense).toFixed(2); - loadBossRankingPreview(); - loadPartnerRankingPreview(); - loadWeeklyChart(); + // 并行加载所有数据 + const [monthlyRes, bossRankRes, partnerRankRes, weeklyRes] = await Promise.all([ + fetch(API + '/api/stats/monthly?year=' + currentYear + '&month=' + currentMonth, { headers: headers() }), + fetch(API + '/api/stats/boss-ranking/preview?year=' + currentYear + '&month=' + currentMonth, { headers: headers() }), + fetch(API + '/api/stats/partner-ranking/preview?year=' + currentYear + '&month=' + currentMonth, { headers: headers() }), + fetch(API + '/api/stats/daily-income', { headers: headers() }) + ]); + + if (monthlyRes.ok) { + const s = await monthlyRes.json(); + document.getElementById('takeCount').textContent = s.take_order_count; + document.getElementById('dispatchCount').textContent = s.dispatch_order_count; + document.getElementById('takeIncome').textContent = '' + s.take_order_income.toFixed(2); + document.getElementById('dispatchIncome').textContent = '' + s.dispatch_order_income.toFixed(2); + document.getElementById('redEnvelopeCount').textContent = s.redEnvelope_count || 0; + document.getElementById('redEnvelopeIncome').textContent = '' + (s.redEnvelope_income || 0).toFixed(2); + document.getElementById('milkTeaCount').textContent = s.milkTea_count || 0; + document.getElementById('milkTeaIncome').textContent = '' + (s.milkTea_income || 0).toFixed(2); + document.getElementById('totalIncome').textContent = '' + s.total_income.toFixed(2); + document.getElementById('totalExpense').textContent = '' + s.total_expense.toFixed(2); + document.getElementById('netIncome').textContent = '' + (s.total_income - s.total_expense).toFixed(2); + } + + if (bossRankRes.ok) { + const data = await bossRankRes.json(); + renderBossRankingPreview(data.rows || []); + } + + if (partnerRankRes.ok) { + const data = await partnerRankRes.json(); + renderPartnerRankingPreview(data.rows || []); + } + + if (weeklyRes.ok) { + const days = await weeklyRes.json(); + renderWeeklyChart(days); + } } catch (e) { console.error(e); } } @@ -25,21 +45,29 @@ async function loadWeeklyChart() { const res = await fetch(API + '/api/stats/daily-income', { headers: headers() }); if (!res.ok) return; const days = await res.json(); - const container = document.getElementById('weeklyChartBars'); - const max = Math.max(...days.map(d => d.income), 1); - container.innerHTML = days.map(d => { - const pct = Math.max((d.income / max) * 100, 3); - const label = d.date.slice(5).replace('-', '/'); - const amount = d.income > 0 ? '' + d.income.toFixed(0) : '0'; - return `
`; - }).join(''); + renderWeeklyChart(days); } catch (e) { console.error(e); } } +function renderWeeklyChart(days) { + const container = document.getElementById('weeklyChartBars'); + if (!days || days.length === 0) { + container.innerHTML = '