Optimize Weekly Sales performance and fix UI hang

This commit is contained in:
Christian Vidal Wolf
2026-01-27 22:42:59 +01:00
parent 747b73a9c2
commit 8be5f1a767
2 changed files with 67 additions and 57 deletions
+27 -17
View File
@@ -1483,20 +1483,31 @@ export const pivotWeeklySalesData = (data: CombinedKPIs[]): {
rows: WeeklyPivotRow[],
weeks: string[]
} => {
// 1. Identify all unique weeks and sort descending (YYYY-WW)
const weekKeys = new Set<string>();
data.forEach(d => {
if (d.week) {
const weekKey = `${d.year}-${String(d.week).padStart(2, '0')}`;
weekKeys.add(weekKey);
}
});
const sortedWeeks = Array.from(weekKeys).sort((a, b) => b.localeCompare(a));
const weekKeysSet = new Set<string>();
const map = new Map<string, WeeklyPivotRow>();
for (let i = 0; i < data.length; i++) {
// Cache week keys to avoid repeated string formatting
// Key: year|week, Value: YYYY-WW
const weekCache = new Map<string, string>();
const getWeekKey = (year: number, week: number) => {
const cacheKey = `${year}|${week}`;
let k = weekCache.get(cacheKey);
if (!k) {
k = `${year}-${String(week).padStart(2, '0')}`;
weekCache.set(cacheKey, k);
}
return k;
};
const len = data.length;
for (let i = 0; i < len; i++) {
const record = data[i];
if (!record.week) continue;
const weekKey = getWeekKey(record.year, record.week);
weekKeysSet.add(weekKey);
const key = record.asin || record.sku || `${record.title}-${record.line}`;
if (!key) continue;
@@ -1516,14 +1527,13 @@ export const pivotWeeklySalesData = (data: CombinedKPIs[]): {
map.set(key, row);
}
if (record.week) {
const weekKey = `${record.year}-${String(record.week).padStart(2, '0')}`;
row.unitsByWeek[weekKey] = (row.unitsByWeek[weekKey] || 0) + (record.unitsTotal || 0);
row.spendByWeek[weekKey] = (row.spendByWeek[weekKey] || 0) + (record.cost || 0);
row.gvByWeek[weekKey] = (row.gvByWeek[weekKey] || 0) + (record.glanceViews || 0);
}
row.unitsByWeek[weekKey] = (row.unitsByWeek[weekKey] || 0) + (record.unitsTotal || 0);
row.spendByWeek[weekKey] = (row.spendByWeek[weekKey] || 0) + (record.cost || 0);
row.gvByWeek[weekKey] = (row.gvByWeek[weekKey] || 0) + (record.glanceViews || 0);
}
const sortedWeeks = Array.from(weekKeysSet).sort((a, b) => b.localeCompare(a));
return {
rows: Array.from(map.values()),
weeks: sortedWeeks