From 3851335843dd056019d5548b4c070e60ee2e5893 Mon Sep 17 00:00:00 2001 From: kkfluous Date: Wed, 29 Apr 2026 19:51:41 +0800 Subject: [PATCH] =?UTF-8?q?fix(energy):=20=E6=B0=A2=E8=83=BD=E5=8D=95?= =?UTF-8?q?=E4=BB=B7=E4=B8=8D=E5=86=8D=E5=8A=A0=E6=9D=83=EF=BC=8C=E6=B7=B7?= =?UTF-8?q?=E5=90=88=E4=BB=B7=E7=BB=84=E6=98=BE=E7=A4=BA=E3=80=8C=E2=80=94?= =?UTF-8?q?=E3=80=8D=E5=B9=B6=E4=BF=AE=E5=A4=8D=20hydrogen=5Ftime=20?= =?UTF-8?q?=E6=AD=A7=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pricePerKg 改为 CASE WHEN MIN=MAX THEN MIN ELSE NULL, 同价组返回原价(无小数误读),混合价组返回 null - 类型 HydrogenStationRow.pricePerKg: number | null - 前端 mobile/desktop 两处展示在 null 时显示「—」 - 修复 ER_NON_UNIQ_ERROR:tab_import_hydrogen_order 也有 hydrogen_time 字段, 把 SELECT/ORDER BY 中 ${HYDROGEN_LOCAL} 替换为显式 b.hydrogen_time 限定 - 实测:712 个站点-日组中 682 个同价直接显示原价,30 个混合显示「—」 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 | 17 +++++++++-------- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/modules/energy/HydrogenDaily.tsx b/src/modules/energy/HydrogenDaily.tsx index 39ac03f..e37c59c 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} + · {s.pricePerKg == null ? '—' : s.pricePerKg} - {s.pricePerKg} + {s.pricePerKg == null ? '—' : s.pricePerKg} {s.kg.toLocaleString('zh-CN', { maximumFractionDigits: 2 })} diff --git a/src/modules/energy/types.ts b/src/modules/energy/types.ts index 5c3f4c7..a2d6b08 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; + pricePerKg: number | null; kg: number; chainPct: number; } diff --git a/src/server/routes/energy/index.ts b/src/server/routes/energy/index.ts index 0933a3c..072144c 100644 --- a/src/server/routes/energy/index.ts +++ b/src/server/routes/energy/index.ts @@ -98,7 +98,7 @@ app.get('/hydrogen/overview', async (c) => { LEFT JOIN tab_import_hydrogen_order i ON i.bill_code = b.bill_code WHERE b.is_deleted = 0 AND b.hydrogen_time >= ? - AND YEAR(${HYDROGEN_LOCAL}) = YEAR(CURDATE()) + AND YEAR(DATE_ADD(b.hydrogen_time, INTERVAL 8 HOUR)) = YEAR(CURDATE()) GROUP BY b.hydrogen_station_id ORDER BY kg DESC LIMIT 5`, @@ -164,10 +164,10 @@ app.get('/hydrogen/daily', async (c) => { ].join(' AND '); // 站点级聚合(每日 × 每站)。前端组装成 day → stations - // 站点名 fallback 顺序:内部站表 → 外部站表 → 导入订单表(tab_import_hydrogen_order.hydrogen_station_name,按 bill_code 关联) - // 单价用「按量加权」的实际效率价:SUM(费用)/SUM(量),同价组自动等于原价(不再产生意外小数) + // 站点名 fallback:内部站表 → 外部站表 → 导入订单表(tab_import_hydrogen_order,按 bill_code 关联) + // 单价不重算:同价组显示原价,混合价组返回 NULL,前端显示「—」 const [stationRows] = await pool.query( - `SELECT DATE_FORMAT(${HYDROGEN_LOCAL}, '%Y-%m-%d') AS d, + `SELECT DATE_FORMAT(DATE_ADD(b.hydrogen_time, INTERVAL 8 HOUR), '%Y-%m-%d') AS d, b.hydrogen_station_id AS stationId, COALESCE(MAX(s.short_name), MAX(s.name), MAX(os.fixed_station_name), MAX(os.station_name), @@ -175,7 +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, - ROUND(SUM(b.cost_expense) / NULLIF(SUM(b.hydrogen_quantity), 0), 2) AS pricePerKg + CASE WHEN MIN(b.cost_price) = MAX(b.cost_price) THEN MIN(b.cost_price) + ELSE NULL END 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 @@ -187,13 +188,13 @@ app.get('/hydrogen/daily', async (c) => { // 站点环比:同站点上一条记录的 kg // 按 stationId 分组、按日期升序计算 - type StationRow = { date: string; stationId: number; name: string; kg: number; pricePerKg: number }; + type StationRow = { date: string; stationId: number; name: string; kg: number; pricePerKg: number | null }; 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: Number(r.pricePerKg) || 0, + pricePerKg: r.pricePerKg == null ? null : Number(r.pricePerKg), })); // 计算日级总量 + 日级环比 @@ -243,7 +244,7 @@ app.get('/hydrogen/daily', async (c) => { .sort((a, b) => b.kg - a.kg) .map(s => ({ name: s.name, - pricePerKg: Math.round(s.pricePerKg * 100) / 100, + pricePerKg: s.pricePerKg == null ? null : Math.round(s.pricePerKg * 100) / 100, kg: Math.round(s.kg * 100) / 100, chainPct: stationChain.get(`${s.date}|${s.stationId}`) ?? 0, })),