From c788dd457732d5618db9e8750580ab02e9a61944 Mon Sep 17 00:00:00 2001 From: kkfluous Date: Wed, 29 Apr 2026 19:56:26 +0800 Subject: [PATCH] =?UTF-8?q?fix(energy):=20=E5=8D=95=E4=BB=B7=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E5=8F=96=20MAX(cost=5Fprice)=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E9=87=8D=E7=AE=97=E4=B8=8D=E8=BF=94=20null?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前用 MIN=MAX...ELSE NULL 判定,再 NULLIF 排零,遇到「1 笔 0 元免费单 + 多笔 35 元正价单」 仍可能误判混合,最终页面显示「—」(如佛山豪汇石油加氢站)。 按业务约定:单价就是订单上记录的成本价,不做"统一性"判定,也不返 null。 改用 MAX(b.cost_price): - 自然忽略 0 元免费/赠送单(被正价 max 掉) - 同价组等于原价 - 极少数真正混合价组也展示该日付出过的最高单价(仍是订单上的真实数字) 回退类型:HydrogenStationRow.pricePerKg 重新固定为 number。 Co-Authored-By: Claude Opus 4.7 (1M context) --- src/modules/energy/HydrogenDaily.tsx | 4 ++-- src/modules/energy/types.ts | 2 +- src/server/routes/energy/index.ts | 10 +++++----- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/modules/energy/HydrogenDaily.tsx b/src/modules/energy/HydrogenDaily.tsx index e37c59c..39ac03f 100644 --- a/src/modules/energy/HydrogenDaily.tsx +++ b/src/modules/energy/HydrogenDaily.tsx @@ -197,9 +197,9 @@ export default function HydrogenDaily() { > {s.name} - · {s.pricePerKg == null ? '—' : s.pricePerKg} + · {s.pricePerKg} - {s.pricePerKg == null ? '—' : s.pricePerKg} + {s.pricePerKg} {s.kg.toLocaleString('zh-CN', { maximumFractionDigits: 2 })} diff --git a/src/modules/energy/types.ts b/src/modules/energy/types.ts index a2d6b08..5c3f4c7 100644 --- a/src/modules/energy/types.ts +++ b/src/modules/energy/types.ts @@ -31,7 +31,7 @@ export interface HydrogenRegionShare { export interface HydrogenStationRow { name: string; - pricePerKg: number | null; + pricePerKg: number; kg: number; chainPct: number; } diff --git a/src/server/routes/energy/index.ts b/src/server/routes/energy/index.ts index 072144c..2fb28d0 100644 --- a/src/server/routes/energy/index.ts +++ b/src/server/routes/energy/index.ts @@ -175,8 +175,8 @@ app.get('/hydrogen/daily', async (c) => { CASE WHEN b.hydrogen_station_id IS NULL THEN '未关联站点' ELSE CONCAT('未知站点 #', b.hydrogen_station_id) END) AS stationName, ROUND(SUM(b.hydrogen_quantity), 2) AS kg, - CASE WHEN MIN(b.cost_price) = MAX(b.cost_price) THEN MIN(b.cost_price) - ELSE NULL END AS pricePerKg + -- 单价:直接取订单中的成本价(不重算)。MAX 自然忽略 0 元的免费/赠送单 + MAX(b.cost_price) AS pricePerKg FROM tab_energy_hydrogen_bill b LEFT JOIN tab_hydrogen_site s ON s.id = b.hydrogen_station_id LEFT JOIN tab_outside_hydrogen_site os ON os.inner_site_id = b.hydrogen_station_id @@ -188,13 +188,13 @@ app.get('/hydrogen/daily', async (c) => { // 站点环比:同站点上一条记录的 kg // 按 stationId 分组、按日期升序计算 - type StationRow = { date: string; stationId: number; name: string; kg: number; pricePerKg: number | null }; + type StationRow = { date: string; stationId: number; name: string; kg: number; pricePerKg: number }; const flat: StationRow[] = stationRows.map(r => ({ date: r.d as string, stationId: Number(r.stationId), name: r.stationName as string, kg: Number(r.kg) || 0, - pricePerKg: r.pricePerKg == null ? null : Number(r.pricePerKg), + pricePerKg: Number(r.pricePerKg) || 0, })); // 计算日级总量 + 日级环比 @@ -244,7 +244,7 @@ app.get('/hydrogen/daily', async (c) => { .sort((a, b) => b.kg - a.kg) .map(s => ({ name: s.name, - pricePerKg: s.pricePerKg == null ? null : Math.round(s.pricePerKg * 100) / 100, + pricePerKg: Math.round(s.pricePerKg * 100) / 100, kg: Math.round(s.kg * 100) / 100, chainPct: stationChain.get(`${s.date}|${s.stationId}`) ?? 0, })),