Refine dashboard charts and branding

This commit is contained in:
liuji
2026-10-10 16:27:51 +08:00
parent 7b089eccc6
commit 838be08cf9
+45 -19
View File
@@ -4,6 +4,7 @@
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="light"> <meta name="color-scheme" content="light">
<link rel="icon" type="image/png" href="https://storage.googleapis.com/msgsndr/lW87lVmHdMr8CFmSlKXl/media/68402c8a28def01375942a3a.png">
<title>TTSHOP 销售看板</title> <title>TTSHOP 销售看板</title>
<style> <style>
:root { :root {
@@ -143,13 +144,18 @@
<section class="charts" id="charts" aria-label="数据图表" hidden> <section class="charts" id="charts" aria-label="数据图表" hidden>
<article class="chart-card"> <article class="chart-card">
<h2>总体趋势</h2> <h2>总体趋势</h2>
<p id="overview-description">按日期汇总</p> <p id="overview-description">按日期汇总 Commission 与 GMV</p>
<div class="chart" id="overview-chart" role="img" aria-label="按日期汇总的 Commission 和 GMV 图表"></div> <div class="chart" id="overview-chart" role="img" aria-label="按日期汇总的 Commission 柱状图和 GMV 折线图"></div>
</article> </article>
<article class="chart-card"> <article class="chart-card">
<h2>LinkName 趋势</h2> <h2>LinkName Commission 趋势</h2>
<p id="link-description">按日期和 LinkName 汇总</p> <p id="link-commission-description">按日期和 LinkName 堆积显示 Commission</p>
<div class="chart" id="link-chart" role="img" aria-label="按日期和 LinkName 汇总的 Commission 和 GMV 图表"></div> <div class="chart" id="link-commission-chart" role="img" aria-label="按日期和 LinkName 堆积的 Commission 折线图"></div>
</article>
<article class="chart-card">
<h2>LinkName GMV 趋势</h2>
<p id="link-gmv-description">按日期和 LinkName 堆积显示 GMV</p>
<div class="chart" id="link-gmv-chart" role="img" aria-label="按日期和 LinkName 堆积的 GMV 柱状图"></div>
</article> </article>
</section> </section>
</main> </main>
@@ -191,9 +197,11 @@
error: document.getElementById('error-state'), error: document.getElementById('error-state'),
charts: document.getElementById('charts'), charts: document.getElementById('charts'),
overviewDescription: document.getElementById('overview-description'), overviewDescription: document.getElementById('overview-description'),
linkDescription: document.getElementById('link-description'), linkCommissionDescription: document.getElementById('link-commission-description'),
linkGmvDescription: document.getElementById('link-gmv-description'),
overview: document.getElementById('overview-chart'), overview: document.getElementById('overview-chart'),
link: document.getElementById('link-chart') linkCommission: document.getElementById('link-commission-chart'),
linkGmv: document.getElementById('link-gmv-chart')
}; };
var state = { rawRecords: [], sourceCurrencies: [], selectedCurrency: '', latestDate: null, dateOnlyRows: 0, invalidCurrencyRows: 0 }; var state = { rawRecords: [], sourceCurrencies: [], selectedCurrency: '', latestDate: null, dateOnlyRows: 0, invalidCurrencyRows: 0 };
@@ -452,28 +460,46 @@
var dates = aggregated.dates.map(function (item) { return item.date.label; }); var dates = aggregated.dates.map(function (item) { return item.date.label; });
var commissionAxisName = 'Commission (' + state.selectedCurrency + ')'; var commissionAxisName = 'Commission (' + state.selectedCurrency + ')';
var gmvAxisName = 'GMV (' + state.selectedCurrency + ')'; var gmvAxisName = 'GMV (' + state.selectedCurrency + ')';
var yAxes = [ var dualAxes = [
{ type: 'value', name: commissionAxisName, nameLocation: 'middle', nameGap: 52 }, { type: 'value', name: commissionAxisName, nameLocation: 'middle', nameGap: 52 },
{ type: 'value', name: gmvAxisName, nameLocation: 'middle', nameGap: 58 } { type: 'value', name: gmvAxisName, nameLocation: 'middle', nameGap: 58 }
]; ];
var common = { animation: false, tooltip: { trigger: 'axis', axisPointer: { type: 'cross' }, formatter: tooltipFormatter }, grid: { left: 70, right: 76, top: 52, bottom: 62 }, xAxis: makeCommonXAxis(dates), yAxis: yAxes }; var common = { animation: false, tooltip: { trigger: 'axis', axisPointer: { type: 'cross' }, formatter: tooltipFormatter }, grid: { left: 70, right: 76, top: 52, bottom: 62 }, xAxis: makeCommonXAxis(dates) };
var overviewSeries = [ var overviewSeries = [
{ name: 'Commission', type: 'line', yAxisIndex: 0, smooth: true, symbol: 'circle', symbolSize: 6, data: aggregated.dates.map(function (item) { return item.commission; }) }, { name: 'Commission', type: 'bar', yAxisIndex: 0, barMaxWidth: 34, data: aggregated.dates.map(function (item) { return item.commission; }) },
{ name: 'GMV', type: 'bar', yAxisIndex: 1, stack: 'gmv-total', barMaxWidth: 34, data: aggregated.dates.map(function (item) { return item.gmv; }) } { name: 'GMV', type: 'line', yAxisIndex: 1, smooth: true, symbol: 'circle', symbolSize: 6, data: aggregated.dates.map(function (item) { return item.gmv; }) }
]; ];
var links = Array.from(aggregated.byLink.keys()).sort(function (a, b) { return a.localeCompare(b); }); var links = Array.from(aggregated.byLink.keys()).sort(function (a, b) { return a.localeCompare(b); });
var linkSeries = []; var linkCommissionSeries = [];
var linkGmvSeries = [];
links.forEach(function (linkName) { links.forEach(function (linkName) {
var linkDates = aggregated.byLink.get(linkName); var linkDates = aggregated.byLink.get(linkName);
linkSeries.push({ name: linkName + ' · Commission', type: 'line', yAxisIndex: 0, stack: 'commission-by-link', smooth: true, symbol: 'circle', symbolSize: 5, data: dates.map(function (_, index) { var item = aggregated.dates[index]; var value = linkDates.get(item.date.key); return value ? value.commission : 0; }) }); var values = dates.map(function (_, index) {
linkSeries.push({ name: linkName + ' · GMV', type: 'bar', yAxisIndex: 1, stack: 'gmv-by-link', barMaxWidth: 34, data: dates.map(function (_, index) { var item = aggregated.dates[index]; var value = linkDates.get(item.date.key); return value ? value.gmv : 0; }) }); var item = aggregated.dates[index];
var value = linkDates.get(item.date.key);
return value || { commission: 0, gmv: 0 };
});
linkCommissionSeries.push({ name: linkName + ' · Commission', type: 'line', stack: 'commission-by-link', smooth: true, symbol: 'circle', symbolSize: 5, data: values.map(function (value) { return value.commission; }) });
linkGmvSeries.push({ name: linkName + ' · GMV', type: 'bar', stack: 'gmv-by-link', barMaxWidth: 34, data: values.map(function (value) { return value.gmv; }) });
});
var commissionChart = Object.assign({}, common, {
yAxis: [{ type: 'value', name: commissionAxisName, nameLocation: 'middle', nameGap: 52 }],
legend: { type: 'scroll', top: 2, data: linkCommissionSeries.map(function (series) { return series.name; }) },
series: linkCommissionSeries
});
var gmvChart = Object.assign({}, common, {
yAxis: [{ type: 'value', name: gmvAxisName, nameLocation: 'middle', nameGap: 52 }],
legend: { type: 'scroll', top: 2, data: linkGmvSeries.map(function (series) { return series.name; }) },
series: linkGmvSeries
}); });
disposeCharts(); disposeCharts();
charts = [echarts.init(elements.overview), echarts.init(elements.link)]; charts = [echarts.init(elements.overview), echarts.init(elements.linkCommission), echarts.init(elements.linkGmv)];
charts[0].setOption(Object.assign({}, common, { color: ['#2563eb', '#f59e0b'], legend: { type: 'scroll', top: 2, data: ['Commission', 'GMV'] }, series: overviewSeries })); charts[0].setOption(Object.assign({}, common, { yAxis: dualAxes, color: ['#2563eb', '#f59e0b'], legend: { type: 'scroll', top: 2, data: ['Commission', 'GMV'] }, series: overviewSeries }));
charts[1].setOption(Object.assign({}, common, { legend: { type: 'scroll', top: 2, data: linkSeries.map(function (series) { return series.name; }) }, series: linkSeries })); charts[1].setOption(commissionChart);
elements.overviewDescription.textContent = '按日期汇总 · 主轴 ' + commissionAxisName + ' · 副轴 ' + gmvAxisName; charts[2].setOption(gmvChart);
elements.linkDescription.textContent = '按日期和 LinkName 堆积 · 主轴 ' + commissionAxisName + ' · 副轴 ' + gmvAxisName; elements.overviewDescription.textContent = '按日期汇总 · Commission 柱状图使用主轴 · GMV 折线图使用副轴 · ' + state.selectedCurrency;
elements.linkCommissionDescription.textContent = '按日期和 LinkName 堆积 · Commission 折线图 · 主轴 ' + commissionAxisName;
elements.linkGmvDescription.textContent = '按日期和 LinkName 堆积 · GMV 柱状图 · 主轴 ' + gmvAxisName;
} }
function showEmpty(message) { function showEmpty(message) {