refactor(stage14): 单站日报 10 条查询移入 repository(能源域四分之三)

改动
- energy/hydrogen-station-board.ts 的 10 条查询全部移入 energy/repository.ts,
  参数表达式逐条对应(含区间、站点、以及租户与手工充值来源的固定顺序)。
- 相关 SQL 片段助手搬进 constants.ts 并导出:
  NORMALIZED_PLATE / NORMALIZED_PLATE_UNICODE / EXTERNAL_CUSTOMER_MAP_CTE,
  以及 HYDROGEN_TENANT_ID / MANUAL_RECHARGE_SOURCE。
  它们本质是 SQL,继续留在路由里会让"路由不含 SQL"形同虚设;放 constants.ts
  是因为被多条查询共享,避免复制。
- 路由文件随之删掉 4 个只为 SQL 服务的 constants 导入(HYDROGEN_BASE_WHERE /
  _B / HYDROGEN_LOCAL / HYDROGEN_TABLE),它们已不再被该文件使用。
- 架构守卫允许 constants.ts 存放共享 SQL 片段,并注明理由。

提取方式
- 用平衡括号扫描从原文件按顺序取出 10 条 SQL 与各自的参数数组(含查询 10 的多行参数),
  按调用点跨度精确替换,避免手工转写 200 余行 SQL。

验证
- energy/routes.test.ts 的 13 个既有用例在提取前后均通过,其中包含单站看板的
  SQL 与参数断言(迁移未改变查询文本、参数顺序与响应口径)。
- 全量 lint / test(191) / build 全绿,可达性 0 未引用文件。

未完成
- hydrogen-bi-v2.ts 仍有 7 条带 ${sqlWhere} / ${groupOrder} 等动态插值的查询,
  需要把 where 组装函数一并搬进 repository;完成后再把 energy 加入守护清单。
This commit is contained in:
dsh-agent
2026-09-11 10:48:35 +08:00
parent e4c8195ede
commit 7802e5b0eb
5 changed files with 295 additions and 218 deletions
+27
View File
@@ -10,3 +10,30 @@ export const HYDROGEN_BASE_WHERE_B = `b.del_flag = '0'`;
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
)`;