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)";