refactor(energy): 简化为始终过滤 GF_HECRI_BILL,移除条件判断
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful

去掉 shouldFilterGfBills 探测、5 分钟缓存、JQ 存在性判定。
4 处氢能查询无条件追加 GF_HECRI_BILL 过滤,逻辑更直接。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
kkfluous
2026-04-29 20:26:52 +08:00
parent e187c0d02e
commit 8b4fb6563f

View File

@@ -22,30 +22,9 @@ function customerClause(field: string, customer: CustomerKind): string {
type Range = 'today' | 'thisWeek' | 'thisMonth' | 'thisQuarter' | 'last7' | 'last30'; type Range = 'today' | 'thisWeek' | 'thisMonth' | 'thisQuarter' | 'last7' | 'last30';
// 是否应过滤 GF_HECRI_BILL 前缀的加氢订单 // 全局过滤 GF_HECRI_BILL 前缀的加氢订单(旧系统遗留单据,已被 JQ 新单号体系替代)
// 当嘉兴嘉燃经开站存在 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<boolean> {
const now = Date.now();
if (gfFilterCache && gfFilterCache.expiresAt > now) return gfFilterCache.value;
const [rows] = await pool.query<RowDataPacket[]>(
`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;
}
const GF_EXCLUDE_CLAUSE = `b.bill_code NOT LIKE 'GF\\_HECRI\\_BILL%' ESCAPE '\\\\'`; 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 { function rangeClause(localExpr: string, range: Range): string {
switch (range) { switch (range) {
@@ -63,9 +42,6 @@ function rangeClause(localExpr: string, range: Range): string {
// ========================================================= // =========================================================
app.get('/hydrogen/overview', async (c) => { app.get('/hydrogen/overview', async (c) => {
const data = await cached('hydrogen/overview', async () => { 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年/月/日 + 我方/客户分解 + 累计羚牛承担) // KPI年/月/日 + 我方/客户分解 + 累计羚牛承担)
const [kpiRows] = await pool.query<RowDataPacket[]>( const [kpiRows] = await pool.query<RowDataPacket[]>(
`SELECT `SELECT
@@ -92,7 +68,7 @@ app.get('/hydrogen/overview', async (c) => {
SUM(CASE WHEN truck_id IS NOT NULL SUM(CASE WHEN truck_id IS NOT NULL
THEN cost_expense ELSE 0 END) AS lingniuBornFee THEN cost_expense ELSE 0 END) AS lingniuBornFee
FROM tab_energy_hydrogen_bill 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], [HYDROGEN_MIN_DATE],
); );
const k = kpiRows[0] ?? {}; const k = kpiRows[0] ?? {};
@@ -127,7 +103,7 @@ app.get('/hydrogen/overview', async (c) => {
WHERE b.is_deleted = 0 WHERE b.is_deleted = 0
AND b.hydrogen_time >= ? AND b.hydrogen_time >= ?
AND YEAR(DATE_ADD(b.hydrogen_time, INTERVAL 8 HOUR)) = YEAR(CURDATE()) AND YEAR(DATE_ADD(b.hydrogen_time, INTERVAL 8 HOUR)) = YEAR(CURDATE())
${gfClause} AND ${GF_EXCLUDE_CLAUSE}
GROUP BY b.hydrogen_station_id GROUP BY b.hydrogen_station_id
ORDER BY kg DESC ORDER BY kg DESC
LIMIT 5`, LIMIT 5`,
@@ -153,7 +129,7 @@ app.get('/hydrogen/overview', async (c) => {
WHERE b.is_deleted = 0 WHERE b.is_deleted = 0
AND b.hydrogen_time >= ? AND b.hydrogen_time >= ?
AND YEAR(DATE_ADD(b.hydrogen_time, INTERVAL 8 HOUR)) = YEAR(CURDATE()) AND YEAR(DATE_ADD(b.hydrogen_time, INTERVAL 8 HOUR)) = YEAR(CURDATE())
${gfClause} AND ${GF_EXCLUDE_CLAUSE}
) r ) r
GROUP BY region GROUP BY region
ORDER BY kg DESC`, 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 data = await cached(`hydrogen/daily?range=${range}&customer=${customer}`, async () => {
const filterGf = await shouldFilterGfBills();
const where = [ const where = [
'b.is_deleted = 0', 'b.is_deleted = 0',
`b.hydrogen_time >= '${HYDROGEN_MIN_DATE}'`, `b.hydrogen_time >= '${HYDROGEN_MIN_DATE}'`,
rangeClause(`b.hydrogen_time + INTERVAL 8 HOUR`, range), rangeClause(`b.hydrogen_time + INTERVAL 8 HOUR`, range),
customerClause('b.truck_id', customer), customerClause('b.truck_id', customer),
filterGf ? GF_EXCLUDE_CLAUSE : '1=1', GF_EXCLUDE_CLAUSE,
].join(' AND '); ].join(' AND ');
// 站点级聚合(每日 × 每站)。前端组装成 day → stations // 站点级聚合(每日 × 每站)。前端组装成 day → stations