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:
123
src/modules/energy/mock.ts
Normal file
123
src/modules/energy/mock.ts
Normal 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),
|
||||||
|
},
|
||||||
|
];
|
||||||
69
src/modules/energy/types.ts
Normal file
69
src/modules/energy/types.ts
Normal 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[];
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user