42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
import type { HydrogenDailyRow } from '../types';
|
|
|
|
export {
|
|
formatYmd,
|
|
getQuickRange,
|
|
getRangeModeLabel,
|
|
normalizeRange,
|
|
QUICK_PICK_OPTIONS,
|
|
type RangeMode,
|
|
} from '../daily-range/model';
|
|
|
|
export function summarizeHydrogenRows(rows: HydrogenDailyRow[] | null) {
|
|
const source = rows ?? [];
|
|
// 图表固定按日期升序;复制数组避免改变接口返回及表格原始顺序。
|
|
const trendData = [...source].sort((left, right) => left.date.localeCompare(right.date));
|
|
const totalKg = source.reduce((total, row) => total + row.totalKg, 0);
|
|
const activeDays = source.filter(row => row.totalKg > 0).length;
|
|
const stationNames = new Set<string>();
|
|
source.forEach(row => row.stations.forEach(station => stationNames.add(station.name)));
|
|
const peakDay = trendData.reduce<HydrogenDailyRow | null>(
|
|
(best, item) => (!best || item.totalKg > best.totalKg ? item : best),
|
|
null,
|
|
);
|
|
const lowDay = trendData
|
|
.filter(item => item.totalKg > 0)
|
|
.reduce<HydrogenDailyRow | null>(
|
|
(low, item) => (!low || item.totalKg < low.totalKg ? item : low),
|
|
null,
|
|
);
|
|
|
|
return {
|
|
trendData,
|
|
totalKg,
|
|
activeDays,
|
|
stationCount: stationNames.size,
|
|
avgKg: activeDays > 0 ? totalKg / activeDays : 0,
|
|
peakDay,
|
|
lowDay,
|
|
zeroDays: source.filter(row => row.totalKg === 0).length,
|
|
};
|
|
}
|