feat(energy): add types and mock data for new module

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
kkfluous
2026-04-28 11:07:04 +08:00
parent ccd97d3aae
commit deb2f2d5da
2 changed files with 192 additions and 0 deletions

123
src/modules/energy/mock.ts Normal file
View File

@@ -0,0 +1,123 @@
import type {
HydrogenKpi, HydrogenStationTop, HydrogenRegionShare,
HydrogenDailyRow, ElectricKpi, ElectricMonthGroup,
} from './types';
export const HYDROGEN_KPI: HydrogenKpi = {
yearKg: 362_430,
yearFee: 10_664_600,
ourYearKg: 245_960,
ourYearFee: 6_955_200,
customerYearKg: 116_470,
monthKg: 85_410,
monthFee: 2_612_300,
todayKg: 0,
todayFee: 0,
lingniuBornKg: 302_620,
lingniuBornFee: 100_300,
};
export const HYDROGEN_STATIONS_TOP5: HydrogenStationTop[] = [
{ rank: 1, name: '佛山豪汇石油加氢站', kg: 78_421.30, fee: 2_744_745, share: 0.216 },
{ rank: 2, name: '嘉兴嘉燃经开站', kg: 65_028.80, fee: 2_275_988, share: 0.179 },
{ rank: 3, name: '广州新锋交通联新加氢站', kg: 54_882.50, fee: 2_195_300, share: 0.151 },
{ rank: 4, name: '北京京辉加氢站', kg: 43_127.40, fee: 1_596_714, share: 0.119 },
{ rank: 5, name: '新疆乌鲁木齐加氢站', kg: 38_601.20, fee: 1_351_042, share: 0.106 },
];
export const HYDROGEN_REGION_SHARE: HydrogenRegionShare[] = [
{ region: '广东', kg: 148_400, share: 0.409 },
{ region: '浙江', kg: 72_500, share: 0.200 },
{ region: '北京', kg: 43_500, share: 0.120 },
{ region: '新疆', kg: 39_000, share: 0.108 },
{ region: '上海', kg: 21_800, share: 0.060 },
{ region: '四川', kg: 16_300, share: 0.045 },
{ region: '河北', kg: 10_900, share: 0.030 },
{ region: '山东', kg: 7_300, share: 0.020 },
{ region: '其他', kg: 2_730, share: 0.008 },
];
const HD_STATION_NAMES = [
{ name: '佛山豪汇石油加氢站', pricePerKg: 35 },
{ name: '嘉兴嘉燃经开站', pricePerKg: 35 },
{ name: '广州新锋交通联新加氢站', pricePerKg: 40 },
{ name: '北京京辉加氢站', pricePerKg: 38 },
{ name: '新疆乌鲁木齐加氢站', pricePerKg: 35 },
];
function makeStations(seed: number): HydrogenDailyRow['stations'] {
const count = 2 + (seed % 3);
return HD_STATION_NAMES.slice(0, count).map((s, i) => ({
name: s.name,
pricePerKg: s.pricePerKg,
kg: Math.round(((seed * 13 + i * 17) % 1500 + 80) * 100) / 100,
chainPct: ((seed * 7 + i * 11) % 200 - 100) / 100 / 2,
}));
}
export const HYDROGEN_DAILY: HydrogenDailyRow[] = Array.from({ length: 30 }, (_, i) => {
const day = 28 - i;
const month = day > 0 ? 4 : 3;
const realDay = day > 0 ? day : day + 31;
const date = `2026-${String(month).padStart(2, '0')}-${String(realDay).padStart(2, '0')}`;
const stations = makeStations(i + 1);
const totalKg = stations.reduce((a, b) => a + b.kg, 0);
const chainPct = ((i * 23) % 100 - 50) / 100;
return {
date,
totalKg: Math.round(totalKg * 100) / 100,
chainPct,
customerType: i % 3 === 0 ? 'lingniu' : 'external',
stations,
};
});
export const ELECTRIC_KPI: ElectricKpi = {
totalKwh: 817_632.24,
totalFee: 151_542.92,
monthKwh: 42_318.56,
monthFee: 8_437.12,
todayKwh: 510.91,
todayFee: 184.82,
todayChainPct: -0.821,
};
const APR_DAYS: Array<[string, number, number]> = [
['2026-04-26', 510.91, 184.82],
['2026-04-25', 2859.61, 314.20],
['2026-04-24', 802.64, 437.83],
['2026-04-23', 2520.22, 495.05],
['2026-04-22', 2234.23, 653.73],
['2026-04-21', 3520.86, 510.06],
['2026-04-20', 527.65, 295.05],
['2026-04-19', 3151.97, 593.55],
['2026-04-18', 1616.38, 183.84],
['2026-04-17', 1069.09, 597.73],
['2026-04-16', 2186.34, 396.63],
['2026-04-15', 2568.16, 572.27],
['2026-04-14', 2315.38, 489.82],
['2026-04-13', 2274.88, 423.15],
['2026-04-12', 2742.85, 248.52],
['2026-04-11', 599.67, 299.13],
['2026-04-10', 2576.59, 806.44],
['2026-04-09', 2627.30, 814.80],
['2026-04-08', 2058.35, 573.11],
['2026-04-07', 2739.61, 261.56],
];
function buildElectricRows(days: Array<[string, number, number]>) {
return days.map(([date, kwh, fee], i) => {
const prev = days[i + 1]?.[1];
const chainPct = prev ? (kwh - prev) / prev : 0;
return { date, kwh, fee, chainPct };
});
}
export const ELECTRIC_MONTHLY: ElectricMonthGroup[] = [
{
month: '2026-04',
kwh: APR_DAYS.reduce((a, [, k]) => a + k, 0),
fee: APR_DAYS.reduce((a, [, , f]) => a + f, 0),
rows: buildElectricRows(APR_DAYS),
},
];

View File

@@ -0,0 +1,69 @@
export type CustomerType = 'external' | 'lingniu';
export type DateQuickPick = 'today' | 'thisWeek' | 'thisMonth' | 'thisQuarter' | 'last7' | 'last30';
export interface HydrogenKpi {
yearKg: number;
yearFee: number;
ourYearKg: number;
ourYearFee: number;
customerYearKg: number;
monthKg: number;
monthFee: number;
todayKg: number;
todayFee: number;
lingniuBornKg: number;
lingniuBornFee: number;
}
export interface HydrogenStationTop {
rank: number;
name: string;
kg: number;
fee: number;
share: number;
}
export interface HydrogenRegionShare {
region: string;
kg: number;
share: number;
}
export interface HydrogenStationRow {
name: string;
pricePerKg: number;
kg: number;
chainPct: number;
}
export interface HydrogenDailyRow {
date: string;
totalKg: number;
chainPct: number;
customerType: CustomerType;
stations: HydrogenStationRow[];
}
export interface ElectricKpi {
totalKwh: number;
totalFee: number;
monthKwh: number;
monthFee: number;
todayKwh: number;
todayFee: number;
todayChainPct: number;
}
export interface ElectricDailyRow {
date: string;
kwh: number;
fee: number;
chainPct: number;
}
export interface ElectricMonthGroup {
month: string;
kwh: number;
fee: number;
rows: ElectricDailyRow[];
}