From 5493e27e49eb306d43d2c1c642ef18562f6be2b5 Mon Sep 17 00:00:00 2001 From: kkfluous Date: Wed, 29 Apr 2026 17:52:03 +0800 Subject: [PATCH] =?UTF-8?q?feat(energy):=20=E7=94=A8=20truck=5Fid=20?= =?UTF-8?q?=E5=8C=BA=E5=88=86=E5=A4=96=E9=83=A8/=E6=88=91=E5=8F=B8?= =?UTF-8?q?=EF=BC=8C=E5=A4=96=E9=83=A8=E6=95=B0=E6=8D=AE=E7=A9=BA=E6=97=B6?= =?UTF-8?q?=E7=BB=99=E5=8F=8B=E5=A5=BD=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 后端 customerClause 改为基于 truck_id:外部=IS NULL,我司=IS NOT NULL - KPI 内联条件(ourYearKg/Fee、customerYearKg、lingniuBornKg/Fee)同步切换为 truck_id - 调用方 /hydrogen/daily 与 /electric/monthly 改传 b.truck_id / truck_id - 当前外部账单 truck_id 尚未对接,HydrogenDaily/ElectricDaily 在 customer=external 且无数据时 改展示「数据对接中…」友好状态(插头图标 + 蓝色脉冲),替代「暂无数据」 Co-Authored-By: Claude Opus 4.7 (1M context) --- src/modules/energy/ElectricDaily.tsx | 23 ++++++++++++++++++++++- src/modules/energy/HydrogenDaily.tsx | 25 +++++++++++++++++++++++-- src/server/routes/energy/index.ts | 19 ++++++++++--------- 3 files changed, 55 insertions(+), 12 deletions(-) diff --git a/src/modules/energy/ElectricDaily.tsx b/src/modules/energy/ElectricDaily.tsx index 6998de2..93f4fef 100644 --- a/src/modules/energy/ElectricDaily.tsx +++ b/src/modules/energy/ElectricDaily.tsx @@ -1,5 +1,5 @@ import { useEffect, useState } from 'react'; -import { ChevronRight } from 'lucide-react'; +import { ChevronRight, Plug } from 'lucide-react'; import { motion, AnimatePresence } from 'motion/react'; import TrendBadge from './TrendBadge'; import { fetchElectricMonthly } from './api'; @@ -48,7 +48,27 @@ export default function ElectricDaily() { ))} + {/* 外部数据对接中 友好空状态 */} + {customer === 'external' && months !== null && months.length === 0 && ( + +
+ + + +
+
数据对接中…
+
+ 外部充电账单正在与合作方系统打通,上线后此处将展示完整数据 +
+
+ )} + {/* 月份分组表 */} + {!(customer === 'external' && months !== null && months.length === 0) && (
月份 / 日期 @@ -122,6 +142,7 @@ export default function ElectricDaily() { ); })}
+ )}
); } diff --git a/src/modules/energy/HydrogenDaily.tsx b/src/modules/energy/HydrogenDaily.tsx index 8dbac33..b2c5897 100644 --- a/src/modules/energy/HydrogenDaily.tsx +++ b/src/modules/energy/HydrogenDaily.tsx @@ -1,5 +1,5 @@ import { useEffect, useMemo, useState } from 'react'; -import { ChevronRight } from 'lucide-react'; +import { ChevronRight, Plug } from 'lucide-react'; import { motion, AnimatePresence } from 'motion/react'; import { BarChart, Bar, XAxis, YAxis, ResponsiveContainer, Cell, Tooltip } from 'recharts'; import TrendBadge from './TrendBadge'; @@ -75,6 +75,25 @@ export default function HydrogenDaily() { ))} + {/* 外部数据对接中 友好空状态 */} + {customer === 'external' && rows !== null && rows.length === 0 && ( + +
+ + + +
+
数据对接中…
+
+ 外部加氢账单正在与合作方系统打通,上线后此处将展示完整数据 +
+
+ )} + {/* 时段加氢量柱图 */} {trendData.length > 0 && (
@@ -116,7 +135,8 @@ export default function HydrogenDaily() {
)} - {/* 表格 */} + {/* 表格(外部空数据时不渲染,由上方友好空状态替代) */} + {!(customer === 'external' && rows !== null && rows.length === 0) && (
{/* 表头 */}
@@ -193,6 +213,7 @@ export default function HydrogenDaily() { ); })}
+ )}
); } diff --git a/src/server/routes/energy/index.ts b/src/server/routes/energy/index.ts index c39399d..e36c807 100644 --- a/src/server/routes/energy/index.ts +++ b/src/server/routes/energy/index.ts @@ -13,9 +13,10 @@ const ELECTRIC_LOCAL = `DATE_ADD(charging_start_time, INTERVAL 8 HOUR)`; type CustomerKind = 'external' | 'lingniu' | 'all'; +// 外部/我司判定:truck_id 为空 = 外部;truck_id 非空 = 我司(羚牛车辆) function customerClause(field: string, customer: CustomerKind): string { - if (customer === 'lingniu') return `${field} IS NULL`; - if (customer === 'external') return `${field} IS NOT NULL`; + if (customer === 'external') return `${field} IS NULL`; + if (customer === 'lingniu') return `${field} IS NOT NULL`; return '1=1'; } @@ -44,11 +45,11 @@ app.get('/hydrogen/overview', async (c) => { THEN hydrogen_quantity ELSE 0 END) AS yearKg, SUM(CASE WHEN YEAR(${HYDROGEN_LOCAL}) = YEAR(CURDATE()) THEN cost_expense ELSE 0 END) AS yearFee, - SUM(CASE WHEN YEAR(${HYDROGEN_LOCAL}) = YEAR(CURDATE()) AND customer_id IS NULL + SUM(CASE WHEN YEAR(${HYDROGEN_LOCAL}) = YEAR(CURDATE()) AND truck_id IS NOT NULL THEN hydrogen_quantity ELSE 0 END) AS ourYearKg, - SUM(CASE WHEN YEAR(${HYDROGEN_LOCAL}) = YEAR(CURDATE()) AND customer_id IS NULL + SUM(CASE WHEN YEAR(${HYDROGEN_LOCAL}) = YEAR(CURDATE()) AND truck_id IS NOT NULL THEN cost_expense ELSE 0 END) AS ourYearFee, - SUM(CASE WHEN YEAR(${HYDROGEN_LOCAL}) = YEAR(CURDATE()) AND customer_id IS NOT NULL + SUM(CASE WHEN YEAR(${HYDROGEN_LOCAL}) = YEAR(CURDATE()) AND truck_id IS NULL THEN hydrogen_quantity ELSE 0 END) AS customerYearKg, SUM(CASE WHEN DATE_FORMAT(${HYDROGEN_LOCAL}, '%Y-%m') = DATE_FORMAT(CURDATE(), '%Y-%m') THEN hydrogen_quantity ELSE 0 END) AS monthKg, @@ -58,9 +59,9 @@ app.get('/hydrogen/overview', async (c) => { THEN hydrogen_quantity ELSE 0 END) AS todayKg, SUM(CASE WHEN DATE(${HYDROGEN_LOCAL}) = CURDATE() THEN cost_expense ELSE 0 END) AS todayFee, - SUM(CASE WHEN customer_id IS NULL + SUM(CASE WHEN truck_id IS NOT NULL THEN hydrogen_quantity ELSE 0 END) AS lingniuBornKg, - SUM(CASE WHEN customer_id IS NULL + SUM(CASE WHEN truck_id IS NOT NULL THEN cost_expense ELSE 0 END) AS lingniuBornFee FROM tab_energy_hydrogen_bill WHERE is_deleted = 0 AND hydrogen_time >= ?`, @@ -154,7 +155,7 @@ app.get('/hydrogen/daily', async (c) => { 'b.is_deleted = 0', `b.hydrogen_time >= '${HYDROGEN_MIN_DATE}'`, rangeClause(`b.hydrogen_time + INTERVAL 8 HOUR`, range), - customerClause('b.customer_id', customer), + customerClause('b.truck_id', customer), ].join(' AND '); // 站点级聚合(每日 × 每站)。前端组装成 day → stations @@ -343,7 +344,7 @@ app.get('/electric/monthly', async (c) => { const where = [ 'is_deleted = 0', - customerClause('customer_id', customer), + customerClause('truck_id', customer), ].join(' AND '); // 取最近 6 个月