From deb2f2d5da08813d5a4f123bd494e8306468d4cf Mon Sep 17 00:00:00 2001 From: kkfluous Date: Tue, 28 Apr 2026 11:07:04 +0800 Subject: [PATCH] feat(energy): add types and mock data for new module Co-Authored-By: Claude Opus 4.7 (1M context) --- src/modules/energy/mock.ts | 123 ++++++++++++++++++++++++++++++++++++ src/modules/energy/types.ts | 69 ++++++++++++++++++++ 2 files changed, 192 insertions(+) create mode 100644 src/modules/energy/mock.ts create mode 100644 src/modules/energy/types.ts diff --git a/src/modules/energy/mock.ts b/src/modules/energy/mock.ts new file mode 100644 index 0000000..f848879 --- /dev/null +++ b/src/modules/energy/mock.ts @@ -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), + }, +]; diff --git a/src/modules/energy/types.ts b/src/modules/energy/types.ts new file mode 100644 index 0000000..5c3f4c7 --- /dev/null +++ b/src/modules/energy/types.ts @@ -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[]; +}