Files
ln-bi/src/server/routes/energy/constants.ts
T
dsh-agent 9750d35ba4 refactor(stage15): 氢能 v2 移入 repository,能源域完成并加入守护清单
改动
- hydrogen-bi-v2.ts 的 14 条查询移入 energy/repository.ts(SQL 与参数表达式逐条对应)。
- 片段组装也随之搬走,因为它们本质是 SQL 构造,留在路由里会让"路由不含 SQL"形同虚设:
  resolvedWhere / stationMasterRegionSql / buildFilterClauses / buildGroupSelect /
  buildGroupExpression / buildScopedWhere。
- 承担方映射片段(CUSTOMER/COMPANY/OTHER_BEARING_ORDER)移入 constants.ts 供多处共享。
- 结果形状从 mysql2 的 [rows, fields] 改为直接返回 rows,路由侧 13 处 [0] 索引同步调整。
- 架构守护的"已完整分层"清单加入 energy(现为 7 个域)。

提取方式与一次失误
- 查询文本用"反引号定界 + 括号配对"扫描提取。第一次用纯括号配对扫描时,
  因为把 SQL 文本里的括号也算了进去,导致调用点跨度越界、文件被改坏;
  已从 git 恢复并改用反引号定界(并对跨度做了"严格递增且不重叠"的断言)后一次通过。
- 中途还有一次变量写错文件(把 repository 内容写进了路由文件),
  被随后的正常写入覆盖,未造成实际损坏;已核对两个文件的首行与关键符号确认无误。

验证
- energy/routes.test.ts 的 13 个用例(含氢能 v2 的口径、利润、账单、路由顺序、
  SQL 与参数指纹)在提取前后全部通过。
- 全量 lint / test(191) / build 全绿,可达性 0 未引用文件。
2026-09-11 10:53:56 +08:00

50 lines
2.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
export const HYDROGEN_MIN_DATE = '2024-01-01';
// hydrogen_fuel_ledger.refuel_time 已是业务本地时间字面值,直接使用即可(不再 +8 小时)
export const HYDROGEN_TABLE = 'hydrogen_fuel_ledger';
export const HYDROGEN_LOCAL = `refuel_time`;
export const HYDROGEN_BASE_WHERE = `del_flag = '0'`;
export const HYDROGEN_BASE_WHERE_B = `b.del_flag = '0'`;
// 充值记录与加氢事实共用台账。经营、日报和下钻必须显式排除充值,
// 充值模块则继续使用 BASE 条件读取自己的流水。
export const HYDROGEN_FUEL_ONLY_WHERE = `${HYDROGEN_BASE_WHERE} AND COALESCE(record_source, '') <> 'external_recharge_manual'`;
export const HYDROGEN_FUEL_ONLY_WHERE_B = `${HYDROGEN_BASE_WHERE_B} AND COALESCE(b.record_source, '') <> 'external_recharge_manual'`;
export const ELECTRIC_LOCAL = `charging_start_time`;
// ---------------------------------------------------------------------------
// 单站看板的 SQL 片段与租户常量。
// 这些是 SQL 的一部分,放在 constants.ts 而不是路由里,避免 SQL 拼装散落两处。
// ---------------------------------------------------------------------------
/** 租户只由服务端配置决定,不接受浏览器传值。 */
export const HYDROGEN_TENANT_ID = process.env.HYDROGEN_TENANT_ID?.trim() || '000000';
export const MANUAL_RECHARGE_SOURCE = 'external_recharge_manual';
export const NORMALIZED_PLATE = (column: string) =>
`UPPER(REPLACE(REPLACE(REPLACE(TRIM(${column}), ' ', ''), '.', ''), '·', ''))`;
export const NORMALIZED_PLATE_UNICODE = (column: string) =>
`CONVERT(${NORMALIZED_PLATE(column)} USING utf8mb4) COLLATE utf8mb4_unicode_ci`;
export const EXTERNAL_CUSTOMER_MAP_CTE = `
WITH external_vehicle_candidates AS (
SELECT ${NORMALIZED_PLATE_UNICODE('plate_number')} AS normalizedPlate,
MAX(NULLIF(TRIM(actual_user), '')) AS customerName,
COUNT(DISTINCT NULLIF(TRIM(actual_user), '')) AS customerCount
FROM hydrogen_order_transfer_external_vehicle_user
WHERE NULLIF(TRIM(plate_number), '') IS NOT NULL
GROUP BY ${NORMALIZED_PLATE_UNICODE('plate_number')}
), external_vehicle_map AS (
SELECT normalizedPlate, customerName
FROM external_vehicle_candidates
WHERE customerCount = 1
AND customerName IS NOT NULL
)`;
// ---------------------------------------------------------------------------
// 氢能 v2 承担方映射片段(b.settlement_type1 客户 / 2 我司 / 其余“其他”)。
// 与站点区域回退表达式一样,这些片段被多条查询共享,集中放置避免各处复制。
// ---------------------------------------------------------------------------
export const CUSTOMER_BEARING_ORDER = "b.settlement_type = 1";
export const COMPANY_BEARING_ORDER = "b.settlement_type = 2";
export const OTHER_BEARING_ORDER =
"(b.settlement_type NOT IN (1, 2) OR b.settlement_type IS NULL)";