# cfg_area_category 台区分类映射表

> 生成时间：2026-02-03 | 更新时间：2026-03-20

## 表信息

| 属性 | 值 |
|------|-----|
| Schema | dws |
| 表名 | cfg_area_category |
| 主键 | category_id |
| 唯一约束 | (source_area_name, COALESCE(source_table_name, '')) |
| 数据来源 | 手工维护/seed脚本（基于用户提供的完整台桌清单） |
| 说明 | 纯台桌级精确映射，每台桌一行 (区域, 台桌名) → 分类代码 |

## 字段说明

| 序号 | 字段名 | 类型 | 可空 | 主键 | 说明 |
|------|--------|------|------|------|------|
| 1 | category_id | SERIAL | NO | PK | 分类ID（自增） |
| 2 | source_area_name | VARCHAR(100) | NO | UK | 源区域名称（来自dim_table.site_table_area_name） |
| 3 | source_table_name | VARCHAR(100) | YES | UK | 源台桌名称（来自dim_table.table_name），NULL仅用于DEFAULT兜底 |
| 4 | category_code | VARCHAR(20) | NO | | 分类代码。**枚举值**: BILLIARD, SNOOKER, MAHJONG, KTV, SPECIAL, OTHER |
| 5 | category_name | VARCHAR(50) | NO | | 分类名称（含emoji） |
| 6 | display_name | VARCHAR(50) | YES | | 显示名称（用于筛选器） |
| 7 | short_name | VARCHAR(20) | YES | | 简写（用于列表标签） |
| 8 | match_type | VARCHAR(10) | NO | | 匹配类型。**枚举值**: EXACT（精确）, DEFAULT（兜底）。LIKE 已废弃 |
| 9 | match_priority | INTEGER | NO | | 匹配优先级（统一为10，兜底999） |
| 10 | is_active | BOOLEAN | NO | | 是否启用 |
| 11 | description | TEXT | YES | | 说明 |
| 12 | created_at | TIMESTAMPTZ | NO | | 创建时间 |
| 13 | updated_at | TIMESTAMPTZ | NO | | 更新时间 |
| 14 | sort_order | INTEGER | NO | | 前端筛选器显示排序（值越小越靠前），DEFAULT 100 |

## 变更说明（2026-03-09）

### 架构变更：纯台桌级精确映射
- 删除所有 LIKE 模糊匹配规则（%VIP%、%斯诺克%、%麻将%、%K包%、%KTV%）
- 删除所有区域级映射（source_table_name IS NULL 的 EXACT 记录）
- 改为每台桌一行精确映射：source_area_name=区域, source_table_name=台桌名
- 仅保留 DEFAULT 兜底规则（source_table_name IS NULL）

### 新增台桌
- KTV：888、常乐、幸会(纯k)、虚拟188、大包、小包、纯k
- MAHJONG：董事办、大包麻将房、666（台桌）
- BILLIARD：VIP1-VIP3（台桌级）、TV、A1-A18、B1-B15、C1-C6
- SNOOKER：S1-S4、VIP5
- SPECIAL：补时长2-7、虚拟台1号

### ETL 代码变更
- `get_area_category()` 去掉区域级精确匹配和 LIKE 模糊匹配分支
- 仅保留台桌级精确匹配 + DEFAULT 兜底

## 匹配规则

| 优先级 | 匹配方式 | 说明 |
|--------|---------|------|
| 10 | 台桌级精确 | source_area_name + source_table_name 都匹配 |
| 999 | 兜底 | 无法匹配的归入 OTHER |

## 分类映射（完整台桌清单）

### BILLIARD 🎱 中式/追分（44台）
| 区域 | 台桌 |
|------|------|
| A区 | A1-A18（18台） |
| B区 | B1-B15（15台） |
| C区 | C1-C6（6台） |
| VIP包厢 | VIP1, VIP2, VIP3 |
| TV台 | TV |
| 美洲豹赛台 | 美洲豹赛台 |

### SNOOKER 斯诺克（5台）
| 区域 | 台桌 |
|------|------|
| 斯诺克区 | S1, S2, S3, S4 |
| VIP包厢 | VIP5 |

### MAHJONG 🀄 麻将/棋牌（11台）
| 区域 | 台桌 |
|------|------|
| 麻将房 | Ｍ1, M2, M3, M4, M5 |
| M7 | M7, 大包麻将房 |
| M8 | M8 |
| 666 | 董事办, 666 |
| 发财 | 发财 |

### KTV 🎤 团建/K歌（7台）
| 区域 | 台桌 |
|------|------|
| K包 | 常乐, 幸会(纯k), 虚拟188, 888 |
| k包活动区 | 大包, 小包 |
| 幸会158 | 纯k |

### SPECIAL 补时长（8台）
| 区域 | 台桌 |
|------|------|
| 补时长 | 补时长, 补时长2-7 |
| 虚拟台 | 虚拟台1号 |

### OTHER 其他
| 匹配 | 说明 |
|------|------|
| DEFAULT | 兜底规则，无法匹配的归入其他 |

## 历史变更

| 日期 | 变更 |
|------|------|
| 2026-02-03 | 初始创建，区域级精确 + LIKE 模糊匹配 |
| 2026-03-07 | 新增 source_table_name 支持台桌级细分；废弃 BILLIARD_VIP |
| 2026-03-09 | 改为纯台桌级精确映射，删除所有 LIKE 和区域级映射 |
| 2026-03-20 | 新增 sort_order 字段，控制前端筛选器分类显示排序 |
| 2026-04-11 | 新增美洲豹赛台 → BILLIARD，BILLIARD 总数 43→44 |

## 验证 SQL

```sql
-- 1. 确认无 LIKE 匹配记录
SELECT COUNT(*) AS like_count FROM dws.cfg_area_category WHERE match_type = 'LIKE';
-- 期望: 0

-- 2. 确认所有 EXACT 记录都有 source_table_name
SELECT COUNT(*) AS null_table_count
FROM dws.cfg_area_category
WHERE match_type = 'EXACT' AND source_table_name IS NULL;
-- 期望: 0

-- 3. 确认 KTV 大类包含 888
SELECT source_area_name, source_table_name, category_code
FROM dws.cfg_area_category
WHERE category_code = 'KTV' AND is_active = true
ORDER BY source_area_name, source_table_name;
-- 期望: 7 行（常乐, 幸会(纯k), 虚拟188, 888, 大包, 小包, 纯k）

-- 4. 确认总记录数
SELECT COUNT(*) AS total FROM dws.cfg_area_category;
-- 期望: 76（75 台桌 + 1 DEFAULT 兜底）

-- 5. 按分类汇总
SELECT category_code, COUNT(*) AS cnt
FROM dws.cfg_area_category
WHERE match_type = 'EXACT'
GROUP BY category_code ORDER BY category_code;
-- 期望: BILLIARD=44, KTV=7, MAHJONG=11, SNOOKER=5, SPECIAL=8
```
