From 64571d58c378478d36dc5d156d8a1c8f922c570d Mon Sep 17 00:00:00 2001 From: kkfluous Date: Fri, 7 Aug 2026 17:03:16 +0800 Subject: [PATCH] feat: reconcile electric daily totals --- docs/bi-refactor-roadmap.md | 1 + src/modules/energy/ElectricDaily.tsx | 25 ++++++++++- .../energy/electric-reconciliation.test.ts | 44 +++++++++++++++++++ src/modules/energy/electric-reconciliation.ts | 35 +++++++++++++++ 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/modules/energy/electric-reconciliation.test.ts create mode 100644 src/modules/energy/electric-reconciliation.ts diff --git a/docs/bi-refactor-roadmap.md b/docs/bi-refactor-roadmap.md index 801dcda..dc3a5ed 100644 --- a/docs/bi-refactor-roadmap.md +++ b/docs/bi-refactor-roadmap.md @@ -169,6 +169,7 @@ SUM(fee) / NULLIF(SUM(kwh), 0) ### 阶段 C:数据可信度 - 已完成电能数据截至时间和实际趋势月展示。 +- 电能日期下钻自动核对日汇总与订单全量合计的日期、车辆范围、电量和费用,并显式展示通过或差异状态。 - 已完成氢能结构化故障状态与重试体验。 - 已完成里程今日仪表快照复用:普通查询命中分钟级快照,手动刷新生成一致的分页快照。 - 已在各 BI 模块头部提供当前数据源的真实请求状态、失败率和最后成功/失败时间。 diff --git a/src/modules/energy/ElectricDaily.tsx b/src/modules/energy/ElectricDaily.tsx index c2ce1b0..f84b426 100644 --- a/src/modules/energy/ElectricDaily.tsx +++ b/src/modules/energy/ElectricDaily.tsx @@ -1,5 +1,5 @@ import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import { BatteryCharging, CalendarDays, ChevronRight, MapPin, Plug, TrendingUp, Truck, Wallet } from 'lucide-react'; +import { BatteryCharging, CalendarDays, CheckCircle2, ChevronRight, MapPin, Plug, TrendingUp, TriangleAlert, Truck, Wallet } from 'lucide-react'; import { motion, AnimatePresence } from 'motion/react'; import TrendBadge from './TrendBadge'; import { fetchElectricMonthly, fetchElectricOrders } from './api'; @@ -20,6 +20,7 @@ import { normalizeDateRange, type DateRangeMode, } from './date-range'; +import { reconcileElectricDaily } from './electric-reconciliation'; const VEHICLE_SCOPE_OPTIONS: readonly AnalysisScopeOption[] = [ { id: 'all', label: '全部车辆' }, @@ -284,6 +285,9 @@ export default function ElectricDaily() { const abnormalBg = isAbnormal ? d.chainPct > 0 ? 'bg-emerald-50/40' : 'bg-red-50/40' : 'bg-slate-50/50'; + const reconciliation = orders?.date === d.date + ? reconcileElectricDaily(d, orders, vehicleScope) + : null; return (