diff --git a/src/server/routes/energy/index.ts b/src/server/routes/energy/index.ts index 94ccb86..ae102e1 100644 --- a/src/server/routes/energy/index.ts +++ b/src/server/routes/energy/index.ts @@ -22,30 +22,9 @@ function customerClause(field: string, customer: CustomerKind): string { type Range = 'today' | 'thisWeek' | 'thisMonth' | 'thisQuarter' | 'last7' | 'last30'; -// 是否应过滤 GF_HECRI_BILL 前缀的加氢订单: -// 当嘉兴嘉燃经开站存在 JQ 前缀订单时(说明业务已切到新单号体系), -// 把 GF_HECRI_BILL 历史/重复订单过滤掉;否则不过滤。 -// 结果缓存 5 分钟,避免每次请求都跑探测查询。 -let gfFilterCache: { value: boolean; expiresAt: number } | null = null; -const GF_FILTER_TTL_MS = 5 * 60 * 1000; -async function shouldFilterGfBills(): Promise { - const now = Date.now(); - if (gfFilterCache && gfFilterCache.expiresAt > now) return gfFilterCache.value; - const [rows] = await pool.query( - `SELECT 1 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 - WHERE b.is_deleted = 0 - AND b.bill_code LIKE 'JQ%' - AND (s.short_name LIKE '%嘉燃经开%' OR s.name LIKE '%嘉燃经开%' - OR os.station_name LIKE '%嘉燃经开%' OR os.fixed_station_name LIKE '%嘉燃经开%') - LIMIT 1`, - ); - const value = rows.length > 0; - gfFilterCache = { value, expiresAt: now + GF_FILTER_TTL_MS }; - return value; -} +// 全局过滤 GF_HECRI_BILL 前缀的加氢订单(旧系统遗留单据,已被 JQ 新单号体系替代) const GF_EXCLUDE_CLAUSE = `b.bill_code NOT LIKE 'GF\\_HECRI\\_BILL%' ESCAPE '\\\\'`; +const GF_EXCLUDE_CLAUSE_NO_ALIAS = `bill_code NOT LIKE 'GF\\_HECRI\\_BILL%' ESCAPE '\\\\'`; function rangeClause(localExpr: string, range: Range): string { switch (range) { @@ -63,9 +42,6 @@ function rangeClause(localExpr: string, range: Range): string { // ========================================================= app.get('/hydrogen/overview', async (c) => { const data = await cached('hydrogen/overview', async () => { - const filterGf = await shouldFilterGfBills(); - const gfClauseKpi = filterGf ? `AND bill_code NOT LIKE 'GF\\_HECRI\\_BILL%' ESCAPE '\\\\'` : ''; - const gfClause = filterGf ? `AND ${GF_EXCLUDE_CLAUSE}` : ''; // KPI(年/月/日 + 我方/客户分解 + 累计羚牛承担) const [kpiRows] = await pool.query( `SELECT @@ -92,7 +68,7 @@ app.get('/hydrogen/overview', async (c) => { 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 >= ? ${gfClauseKpi}`, + WHERE is_deleted = 0 AND hydrogen_time >= ? AND ${GF_EXCLUDE_CLAUSE_NO_ALIAS}`, [HYDROGEN_MIN_DATE], ); const k = kpiRows[0] ?? {}; @@ -127,7 +103,7 @@ app.get('/hydrogen/overview', async (c) => { WHERE b.is_deleted = 0 AND b.hydrogen_time >= ? AND YEAR(DATE_ADD(b.hydrogen_time, INTERVAL 8 HOUR)) = YEAR(CURDATE()) - ${gfClause} + AND ${GF_EXCLUDE_CLAUSE} GROUP BY b.hydrogen_station_id ORDER BY kg DESC LIMIT 5`, @@ -153,7 +129,7 @@ app.get('/hydrogen/overview', async (c) => { WHERE b.is_deleted = 0 AND b.hydrogen_time >= ? AND YEAR(DATE_ADD(b.hydrogen_time, INTERVAL 8 HOUR)) = YEAR(CURDATE()) - ${gfClause} + AND ${GF_EXCLUDE_CLAUSE} ) r GROUP BY region ORDER BY kg DESC`, @@ -186,13 +162,12 @@ app.get('/hydrogen/daily', async (c) => { const data = await cached(`hydrogen/daily?range=${range}&customer=${customer}`, async () => { - const filterGf = await shouldFilterGfBills(); const where = [ 'b.is_deleted = 0', `b.hydrogen_time >= '${HYDROGEN_MIN_DATE}'`, rangeClause(`b.hydrogen_time + INTERVAL 8 HOUR`, range), customerClause('b.truck_id', customer), - filterGf ? GF_EXCLUDE_CLAUSE : '1=1', + GF_EXCLUDE_CLAUSE, ].join(' AND '); // 站点级聚合(每日 × 每站)。前端组装成 day → stations