改动 - 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 未引用文件。
50 lines
2.8 KiB
TypeScript
50 lines
2.8 KiB
TypeScript
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_type:1 客户 / 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)";
|