From 7c8e88666303d239e5ddf08cd4db482b27d28eb2 Mon Sep 17 00:00:00 2001 From: shishengliang Date: Fri, 11 Sep 2026 11:26:55 +0800 Subject: [PATCH] =?UTF-8?q?fix(energy):=20=E6=97=A0=E8=BD=A6=E7=89=8C?= =?UTF-8?q?=E6=88=96=E6=9C=AA=E5=85=B3=E8=81=94=E7=BE=9A=E7=89=9B=E8=BD=A6?= =?UTF-8?q?=E8=BE=86=E7=9A=84=E8=AE=A2=E5=8D=95=E4=B8=8D=E5=86=8D=E8=AE=A1?= =?UTF-8?q?=E5=85=A5=E5=BE=85=E6=A0=B8=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 待核对原先只看「未核对 + 期初之后」,会把没有核对对象的流水也算进 待核对笔数与金额,虚高 KPI 并污染下钻列表。 在 unverified 过滤条件里补两条限定: - NULLIF(TRIM(license_plate), '') IS NOT NULL:无车牌无核对对象 - COALESCE(vehicle_id, 0) <> 0:vehicle_id 为 NULL/0 即未关联羚牛车辆库 条件加在 buildFilterClauses 的 unverified 分支,汇总 KPI 与下钻共用, 因此两处口径自动一致;all / verified 不受影响。下钻弹窗提示同步说明口径。 --- .../hydrogen/drill/prototype-real-drills.tsx | 2 +- src/server/routes/energy/repository.ts | 4 ++++ src/server/routes/energy/routes.test.ts | 16 ++++++++++++++-- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/modules/energy/hydrogen/drill/prototype-real-drills.tsx b/src/modules/energy/hydrogen/drill/prototype-real-drills.tsx index 54623cf..c45749a 100644 --- a/src/modules/energy/hydrogen/drill/prototype-real-drills.tsx +++ b/src/modules/energy/hydrogen/drill/prototype-real-drills.tsx @@ -1237,7 +1237,7 @@ export function PrototypeDrillModal({ ) : null} -{cleanLabel === "待核对订单" ?
核对功能上线期初:{HYDROGEN_VERIFY_START_DATE}(含)。仅统计当前查询范围与上线期初之后的交集;此前订单不计入待核对。
: null} +{cleanLabel === "待核对订单" ?
核对功能上线期初:{HYDROGEN_VERIFY_START_DATE}(含)。仅统计当前查询范围与上线期初之后的交集,且只包含有车牌、已关联羚牛车辆的订单;无车牌、未关联羚牛车辆及上线期初之前的订单不计入待核对。
: null} {cleanLabel === "加氢利润" && customerBearingScope ? (
利润口径:客户承担订单的对客总价 ¥ diff --git a/src/server/routes/energy/repository.ts b/src/server/routes/energy/repository.ts index b43b304..4473953 100644 --- a/src/server/routes/energy/repository.ts +++ b/src/server/routes/energy/repository.ts @@ -768,6 +768,10 @@ export function buildFilterClauses(input: { "LOWER(COALESCE(NULLIF(TRIM(b.verify_status), ''), 'unverified')) <> 'verified'", // 待核对只统计核对上线期初(含当日)之后的订单,期初之前的历史订单不算待核对。 `b.refuel_time >= '${HYDROGEN_VERIFY_START_DATE}'`, + // 无车牌的订单没有核对对象;未关联羚牛车辆(vehicle_id 为 NULL 或 0)的订单 + // 无法与车辆库对账,两者都不进入待核对范围。 + "NULLIF(TRIM(b.license_plate), '') IS NOT NULL", + "COALESCE(b.vehicle_id, 0) <> 0", ); return { clauses, params }; } diff --git a/src/server/routes/energy/routes.test.ts b/src/server/routes/energy/routes.test.ts index e288b6c..d5787c8 100644 --- a/src/server/routes/energy/routes.test.ts +++ b/src/server/routes/energy/routes.test.ts @@ -35,7 +35,13 @@ interface CacheCall { test("待核对的汇总和下钻统一从核对上线期初起统计,不影响其他核对范围", async () => { // 期初日期以字面量锁定:它同时被前端文案引用,改动必须是有意的。 assert.equal(HYDROGEN_VERIFY_START_DATE, "2026-01-01"); - const cutoverClause = `b.refuel_time >= '${HYDROGEN_VERIFY_START_DATE}'`; + const unverifiedOnlyClauses = [ + // 期初之前的订单不算待核对。 + `b.refuel_time >= '${HYDROGEN_VERIFY_START_DATE}'`, + // 无车牌、或未关联羚牛车辆(vehicle_id 为 NULL/0)的订单没有核对对象。 + "NULLIF(TRIM(b.license_plate), '') IS NOT NULL", + "COALESCE(b.vehicle_id, 0) <> 0", + ]; for (const scope of ["unverified", "all", "verified"]) { for (const endpoint of ["overview", "drill"]) { const calls: QueryCall[] = []; @@ -48,7 +54,13 @@ test("待核对的汇总和下钻统一从核对上线期初起统计,不影 const ledgerQueries = calls.filter(({ sql }) => sql.includes("FROM hydrogen_fuel_ledger b")); assert.ok(ledgerQueries.length > 0); for (const { sql } of ledgerQueries) { - assert.equal(sql.includes(cutoverClause), scope === "unverified"); + for (const clause of unverifiedOnlyClauses) { + assert.equal( + sql.includes(clause), + scope === "unverified", + `${endpoint}/${scope} 对待核对限定条件「${clause}」的处理不符合预期`, + ); + } } } }