# -*- coding: utf-8 -*- """区域映射配置 — ETL 和后端共用。 将 dim_table.site_table_area_name(物理区域名称)映射到标准 area_code。 区域编码体系(9 个值): - 7 个具体区域:hallA / hallB / hallC / vip / snooker / mahjong / ktv - hall = 台球大厅(hallA + hallB + hallC) - all = 所有区域之和 """ from __future__ import annotations # ── 核心映射:area_code → 物理区域名称列表 ────────────────────────── AREA_LABEL_MAP: dict[str, list[str]] = { "hallA": ["A区"], "hallB": ["B区"], "hallC": ["C区", "TV台", "美洲豹赛台"], "vip": ["VIP包厢"], "snooker": ["斯诺克区"], "mahjong": ["麻将房", "M7", "M8", "666", "发财"], "ktv": ["K包", "k包活动区", "幸会158"], } # ── 派生常量 ──────────────────────────────────────────────────────── SPECIFIC_AREA_CODES: list[str] = list(AREA_LABEL_MAP.keys()) """7 个具体区域编码(不含 all / hall)。""" ALL_AREA_CODES: list[str] = ["all", "hall"] + SPECIFIC_AREA_CODES """全部 9 个区域编码。""" # ── 反向映射:物理区域名称 → area_code ────────────────────────────── _REVERSE_MAP: dict[str, str] = { label: code for code, labels in AREA_LABEL_MAP.items() for label in labels } # ── 公开函数 ──────────────────────────────────────────────────────── def resolve_area_code(area_name: str | None) -> str | None: """输入 site_table_area_name,返回对应的 area_code。 未匹配返回 None,由调用方(ETL)决定是否记录警告。 """ if area_name is None: return None return _REVERSE_MAP.get(area_name) def get_area_labels(area_code: str) -> list[str] | None: """输入 area_code,返回对应的物理区域名称列表。 all / hall 不对应具体物理区域,返回 None。 未知 area_code 同样返回 None。 """ return AREA_LABEL_MAP.get(area_code)