feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本
包含多个会话的累积代码变更: - backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔 - admin-web: ETL 状态页、任务管理、调度配置、登录优化 - miniprogram: 看板页面、聊天集成、UI 组件、导航更新 - etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强 - tenant-admin: 项目初始化 - db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8) - packages/shared: 枚举和工具函数更新 - tools: 数据库工具、报表生成、健康检查 - docs: PRD/架构/部署/合约文档更新 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
- enums: 字段枚举定义(支付状态、订单状态、会员状态、助教状态等)
|
||||
- money: 金额精度工具(CNY,Decimal + ROUND_HALF_UP,scale=2)
|
||||
- datetime_utils: 时区转换、日期范围计算
|
||||
- area_mapping: 区域映射配置(ETL 和后端共用)
|
||||
"""
|
||||
|
||||
from neozqyy_shared.enums import (
|
||||
@@ -24,6 +25,13 @@ from neozqyy_shared.datetime_utils import (
|
||||
business_week_range,
|
||||
business_month_range,
|
||||
)
|
||||
from neozqyy_shared.area_mapping import (
|
||||
AREA_LABEL_MAP,
|
||||
SPECIFIC_AREA_CODES,
|
||||
ALL_AREA_CODES,
|
||||
resolve_area_code,
|
||||
get_area_labels,
|
||||
)
|
||||
|
||||
__all__ = [
|
||||
# enums
|
||||
@@ -44,4 +52,10 @@ __all__ = [
|
||||
"business_day_range",
|
||||
"business_week_range",
|
||||
"business_month_range",
|
||||
# area_mapping
|
||||
"AREA_LABEL_MAP",
|
||||
"SPECIFIC_AREA_CODES",
|
||||
"ALL_AREA_CODES",
|
||||
"resolve_area_code",
|
||||
"get_area_labels",
|
||||
]
|
||||
|
||||
56
packages/shared/src/neozqyy_shared/area_mapping.py
Normal file
56
packages/shared/src/neozqyy_shared/area_mapping.py
Normal file
@@ -0,0 +1,56 @@
|
||||
# -*- 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)
|
||||
Reference in New Issue
Block a user