RuoYi-Vue-Plus/docs/basic/PMS数据模型.md

754 lines
52 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 云宿居 PMS 系统 - PMS核心数据模型 (最终版 v_ry_final_4.0)
**快速导航:**
- [1. 引言](#1-引言)
- [2. PMS 核心E-R图 (最终版 - 简化)](#2-pms-核心er图-最终版---简化)
- [3. 表结构定义](#3-表结构定义)
- [3.1 SaaS平台与系统基础表 (源自若依)](#31-saas平台与系统基础表-源自若依)
- [3.2 PMS核心业务表](#32-pms核心业务表)
- [3.3 公共数据模型 (PMS相关)](#33-公共数据模型-pms相关)
- [4. 主要业务实体状态流转](#4-主要业务实体状态流转)
- [5. 核心业务枚举值定义 (PMS主要部分)](#5-核心业务枚举值定义-pms主要部分)
- [6. 索引命名与规范建议](#6-索引命名与规范建议)
## 1. 引言
### 1.1 文档目的与范围
本文档详细定义了"云宿居"民宿 Property Management System (PMS) 的数据库逻辑模型,并与其依赖的若依框架的基础表(如租户、用户、部门等)进行了整合。本文档旨在为数据库的物理实现和后端开发提供具体指导。
**核心原则:**
1. 若依框架的基础实体(用户、租户、角色、部门等)及其字段规范固定不变。
2. PMS新增的核心业务表主键统一采用 `BIGINT` 自增ID。
3. **PMS业务表只关联部门(`dept_id`),不直接关联租户(`tenant_id`)。部门代表实际的门店/分店,通过部门可以查询到其所属租户信息。** 这使得"一个租户下有多个门店"的业务模型更加清晰,同时减少数据冗余。
4. **特例:`pms_tenant_settings`和`pms_mp_settings`表保留tenant_id字段通过dept_id为NULL来表示租户全局设置通过具体的dept_id值表示部门/门店特定设置。**
5. PMS业务表中的枚举字段统一使用 `VARCHAR(50)` 存储描述性字符串以增强可读性和扩展性。这与若依常用的 `CHAR(1)` 枚举在交互时需注意API层面的适配。
### 1.2 命名与设计约定 (PMS新增表部分)
* **表命名:** `pms_` (PMS核心业务表)`cmn_` (公共模块)。若依表使用其原生 `sys_` 前缀。
* **字段命名:** `snake_case` (小写下划线)。
* **主键 (PK):**
* PMS核心业务实体: **`BIGINT` AUTO_INCREMENT**。
* 日志类高频写入表: `BIGINT` AUTO_INCREMENT。
* **部门ID `dept_id`:** `bigint(20)` (同 `sys_dept.dept_id`)在PMS业务表中非空用于标识数据归属于哪个门店。
* **外键 (FK):** 类型与关联表主键一致。`COMMENT '关联 table_name.column_name'`。
* **通用审计字段 (对齐若依):**
* `create_by` (BIGINT(20) NULLABLE, COMMENT '创建者,关联 sys_user.user_id')
* `create_time` (DATETIME NULLABLE, COMMENT '创建时间')
* `update_by` (BIGINT(20) NULLABLE, COMMENT '更新者,关联 sys_user.user_id')
* `update_time` (DATETIME NULLABLE, COMMENT '更新时间')
* `create_dept_id` (BIGINT(20) NULLABLE, COMMENT '创建记录的操作员所属部门,关联 sys_dept.dept_id')
* **软删除策略 (对齐若依):**
* `del_flag` (CHAR(1) DEFAULT '0' NOT NULL, COMMENT '删除标志0代表存在 1代表删除')。
* **状态与枚举字段 (PMS优化):**
* PMS业务表中的枚举字段统一使用 `VARCHAR(50)` 存储描述性枚举字符串。
## 2. PMS 核心E-R图 (最终版 - 简化)
```mermaid
erDiagram
%% --- 若依基础表 (关键部分) ---
sys_tenant {
varchar(20) tenant_id PK "租户编号 (业务主键)"
bigint id "物理主键, 若依内部使用"
varchar(255) company_name "企业/民宿名称"
}
sys_dept {
bigint dept_id PK "部门ID"
varchar(20) tenant_id FK "关联 sys_tenant.tenant_id"
varchar(30) dept_name "部门名称"
}
sys_user {
bigint user_id PK "用户ID (PMS员工)"
varchar(20) tenant_id FK "用户初始归属租户"
bigint dept_id FK "用户所属部门"
varchar(30) user_name "用户名, 全局唯一"
}
sys_role {
bigint role_id PK "角色ID"
varchar(20) tenant_id FK "角色定义所属租户 (或平台)"
varchar(30) role_name "角色名称"
}
%% --- Common Contact Table ---
cmn_contacts {
BIGINT contact_id PK "联系人ID (自增)"
BIGINT dept_id FK "所属部门ID"
VARCHAR(255) full_name "姓名"
}
%% --- PMS Core Business Tables (主键改为BIGINT) ---
pms_room_types {
BIGINT room_type_id PK "房型ID (自增)"
BIGINT dept_id FK "部门ID"
VARCHAR(255) name "房型名称"
}
pms_room_rooms {
BIGINT room_id PK "房间ID (自增)"
BIGINT dept_id FK "部门ID"
BIGINT room_type_id FK "房型ID"
VARCHAR(255) room_number "房间号"
VARCHAR(50) room_status "物理状态"
VARCHAR(50) cleaning_status "清洁状态"
}
pms_room_locks {
BIGINT lock_id PK "锁定ID (自增)"
BIGINT dept_id FK "部门ID"
BIGINT room_id FK "房间ID"
}
pms_core_orders {
BIGINT order_id PK "订单ID (自增)"
BIGINT dept_id FK "部门ID"
BIGINT contact_id FK "联系人ID"
BIGINT room_type_id FK "房型ID"
BIGINT pms_room_id FK "房间ID(可空)"
VARCHAR(50) order_status "订单状态"
VARCHAR(50) order_source "订单来源"
}
pms_core_order_items {
BIGINT order_item_id PK "订单项ID (自增)"
BIGINT order_id FK "订单ID"
BIGINT dept_id FK "部门ID"
VARCHAR(50) product_type "产品类型"
}
pms_core_channels {
BIGINT channel_id PK "渠道ID (自增)"
BIGINT dept_id FK "部门ID(可空)"
VARCHAR(50) channel_type "渠道类型"
}
pms_finance_folios {
BIGINT folio_id PK "账单ID (自增)"
BIGINT dept_id FK "部门ID"
BIGINT order_id FK "订单ID(UNIQUE)"
VARCHAR(50) folio_status "账单状态"
}
pms_finance_transactions {
BIGINT transaction_id PK "交易ID (自增)"
BIGINT folio_id FK "账单ID"
BIGINT dept_id FK "部门ID"
VARCHAR(50) transaction_type "交易类型"
}
pms_finance_payment_methods {
BIGINT payment_method_id PK "支付方式ID (自增)"
BIGINT dept_id FK "部门ID"
VARCHAR(50) method_type "支付方式类型"
}
pms_finance_extra_charge_items {
BIGINT item_id PK "附加费用项ID (自增)"
BIGINT dept_id FK "部门ID"
}
pms_room_pricing_rules {
BIGINT rule_id PK "价格规则ID (自增)"
BIGINT dept_id FK "部门ID"
BIGINT room_type_id FK "房型ID(可空)"
}
pms_tenant_settings {
BIGINT setting_id PK "设置ID (自增)"
BIGINT dept_id FK "部门ID"
VARCHAR(100) setting_group "设置分组"
VARCHAR(100) setting_key "设置键名"
}
pms_mp_settings {
BIGINT setting_id PK "小程序设置ID (自增)"
BIGINT dept_id FK "部门ID"
VARCHAR(100) setting_key "设置键名"
}
pms_tenant_user_devices {
BIGINT id PK "设备记录ID (自增)"
BIGINT user_id FK "用户ID"
}
cmn_contact_tags {
BIGINT tag_id PK "标签ID (自增)"
BIGINT dept_id FK "部门ID"
}
cmn_contact_tag_relations {
BIGINT relation_id PK "关联ID (自增)"
BIGINT contact_id FK "联系人ID"
BIGINT tag_id FK "标签ID"
}
%% --- 若依基础表关联 ---
sys_tenant ||--o{ sys_dept : "包含门店/部门"
sys_tenant ||--o{ sys_user : "的主要租户"
sys_tenant ||--o{ sys_role : "定义角色归属"
sys_dept ||--o{ sys_user : "员工属于门店"
%% --- PMS 表关联到若依基础表 ---
sys_dept ||--o{ pms_room_types : "定义房型"
sys_dept ||--o{ pms_room_rooms : "拥有房间"
sys_dept ||--o{ pms_core_orders : "拥有订单"
sys_dept ||--o{ cmn_contacts : "拥有联系人"
sys_dept ||--o{ pms_tenant_settings : "拥有PMS配置"
sys_dept ||--o{ pms_mp_settings : "拥有小程序配置"
sys_dept ||--o{ cmn_contact_tags : "定义联系人标签"
sys_user ||--o{ pms_tenant_user_devices : "注册设备"
%% --- PMS 内部表关联 ---
pms_room_types ||--o{ pms_room_rooms : "有具体房间"
pms_room_types ||--o{ pms_core_orders : "被预订类型"
pms_room_types o|--o{ pms_room_pricing_rules : "规则适用房型"
pms_room_rooms ||--o{ pms_room_locks : "可被锁定"
pms_room_rooms o|--o{ pms_core_orders : "被分配房间"
pms_room_rooms o|--o{ pms_core_order_items : "关联房晚项目"
pms_core_orders ||--o{ pms_core_order_items : "包含项目"
pms_core_orders ||--|| pms_finance_folios : "生成账单"
cmn_contacts o|--o{ pms_core_orders : "是主要联系人"
pms_core_channels o|--o{ pms_core_orders : "是来源渠道"
pms_finance_folios ||--o{ pms_finance_transactions : "记录交易"
pms_finance_payment_methods o|--o{ pms_finance_transactions : "使用支付方式"
pms_finance_extra_charge_items o|--o{ pms_core_order_items : "可以是附加项"
cmn_contacts ||--o{ cmn_contact_tag_relations : "关联标签"
cmn_contact_tags ||--o{ cmn_contact_tag_relations : "被应用于"
```
*注E-R图中部分表的字段为简化表示详细字段请参照下文。*
## 3. 表结构定义
### 3.1 SaaS平台与系统基础表 (源自若依)
这些表结构直接采用或参考附件 `ry_vue_5.X - 副本.txt` 中的定义,关键表包括:
* `sys_tenant`: 租户表 (业务主键 `tenant_id varchar(20)`)
* `sys_dept`: 部门表 (主键 `dept_id bigint(20)`),在本系统中将作为门店/分店使用
* `sys_user`: 用户信息表 (主键 `user_id bigint(20)`)
* `sys_role`: 角色信息表 (主键 `role_id bigint(20)`)
* `sys_user_role`: 用户角色关联表
* `sys_config`: 参数配置表
* `sys_logininfor`: 系统访问记录(登录日志)
* `sys_dict_type`, `sys_dict_data`: 字典表 (PMS枚举值优先在PMS表中使用 `VARCHAR(50)`,但若依系统本身的字典可按其规范使用)
**PMS系统将直接使用或关联这些若依表中的记录例如PMS订单的 `dept_id` 将关联到 `sys_dept.dept_id``create_by` 将关联到 `sys_user.user_id`。部门进一步通过 `sys_dept.tenant_id` 关联到租户。**
### 3.2 PMS核心业务表
#### 3.2.1 `pms_room_types` - 房型表
* 业务描述: 存储各部门(门店)定义的房型信息。
* 主键: `room_type_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `room_type_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '房型唯一ID'): 主键。
* `dept_id` (BIGINT(20), NOT NULL, COMMENT '部门ID(门店), 关联 sys_dept.dept_id')。
* `name` (VARCHAR(255), NOT NULL, COMMENT '房型名称 (例如: 豪华大床房)')。
* `default_price` (DECIMAL(10,2), NOT NULL, COMMENT '房型默认价格 (每晚)')。
* `capacity` (INT, NOT NULL, COMMENT '标准入住人数')。
* `amenities` (JSON, NULLABLE, COMMENT '房型设施标签。JSON数组例如 [\"wifi\", \"空调\"]')。
* `description` (TEXT, NULLABLE, COMMENT '房型描述')。
* `images_json` (JSON, NULLABLE, COMMENT '房型图片。JSON数组')。
* `sort_order` (INT, DEFAULT 0, COMMENT '显示排序值')。
* `status` (VARCHAR(50), NOT NULL, DEFAULT 'active', COMMENT '状态。枚举: active (启用), inactive (禁用)')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_rt_dept_name` (dept_id, name), `idx_pms_rt_dept_status` (dept_id, status)
#### 3.2.2 `pms_room_rooms` - 房间表
* 业务描述: 存储各部门(门店)的具体房间信息。
* 主键: `room_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `room_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '房间唯一ID')。
* `dept_id` (BIGINT(20), NOT NULL, COMMENT '部门ID(门店), 关联 sys_dept.dept_id')。
* `room_type_id` (BIGINT, FK, NOT NULL, COMMENT '所属房型ID, 关联 pms_room_types.room_type_id')。
* `room_number` (VARCHAR(50), NOT NULL, COMMENT '房间号 (在门店内应唯一)')。
* `floor` (VARCHAR(50), NULLABLE, COMMENT '楼层')。
* `room_status` (VARCHAR(50), NOT NULL, DEFAULT 'available', COMMENT '物理状态。枚举: available (可用), occupied (占用中), maintenance (维护中), out_of_service (停用服务)')。
* `cleaning_status` (VARCHAR(50), NOT NULL, DEFAULT 'clean', COMMENT '清洁状态。枚举: clean (已清洁), dirty (待清洁), cleaning_in_progress (清洁中), inspected (已查房)')。
* `description` (TEXT, NULLABLE, COMMENT '房间描述或备注')。
* `status` (VARCHAR(50), NOT NULL, DEFAULT 'active', COMMENT '记录状态。枚举: active (启用), inactive (禁用)')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 唯一约束: `unq_pms_r_dept_room_number` (dept_id, room_number, del_flag)
* 索引: `idx_pms_r_dept_rt` (dept_id, room_type_id), `idx_pms_r_dept_room_status` (dept_id, room_status), `idx_pms_r_dept_cleaning_status` (dept_id, cleaning_status)
#### 3.2.3 `pms_room_locks` - 房间锁定记录表
* 业务描述: 记录房间因维护、手动操作等原因被锁定的情况。
* 主键: `lock_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `lock_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '锁定记录唯一ID')。
* `dept_id` (BIGINT(20), NOT NULL, COMMENT '部门ID, 关联 sys_dept.dept_id')。
* `room_id` (BIGINT, FK, NOT NULL, COMMENT '被锁定的房间ID, 关联 pms_room_rooms.room_id')。
* `start_datetime` (DATETIME, NOT NULL, COMMENT '锁定开始时间')。
* `end_datetime` (DATETIME, NOT NULL, COMMENT '锁定结束时间')。
* `reason` (TEXT, NULLABLE, COMMENT '锁定原因')。
* `lock_type` (VARCHAR(50), NOT NULL, DEFAULT 'manual_lock', COMMENT '锁定类型。枚举: manual_lock (手动锁定), maintenance (维护), auto_block (自动锁定), staff_use (员工自用)')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_rl_tenant_dept_room_time` (tenant_id, dept_id, room_id, start_datetime, end_datetime), `idx_pms_rl_tenant_dept_lock_type` (tenant_id, dept_id, lock_type)
#### 3.2.4 `pms_core_orders` - 核心订单表
* 业务描述: 存储所有来源的预订订单核心信息。
* 主键: `order_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `order_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '订单唯一ID')。
* `dept_id` (BIGINT(20), NOT NULL, COMMENT '部门ID, 关联 sys_dept.dept_id')。
* `contact_id` (BIGINT, FK, NULLABLE, COMMENT '主要联系人ID, 关联 cmn_contacts.contact_id')。
* `primary_contact_name` (VARCHAR(100), NOT NULL, COMMENT '主要联系人姓名 (冗余)')。
* `primary_contact_phone` (VARCHAR(50), NOT NULL, COMMENT '主要联系人电话 (冗余)')。
* `pms_room_id` (BIGINT, FK, NULLABLE, COMMENT '分配的房间ID, 关联 pms_room_rooms.room_id, 入住时分配')。
* `room_type_id` (BIGINT, FK, NOT NULL, COMMENT '预订的房型ID, 关联 pms_room_types.room_type_id')。
* `channel_id` (BIGINT, FK, NULLABLE, COMMENT '订单来源渠道ID, 关联 pms_core_channels.channel_id')。
* `check_in_date` (DATE, NOT NULL, COMMENT '计划入住日期')。
* `check_out_date` (DATE, NOT NULL, COMMENT '计划离店日期')。
* `num_adults` (INT, NOT NULL, DEFAULT 1, COMMENT '成人数')。
* `num_children` (INT, DEFAULT 0, COMMENT '儿童数')。
* `estimated_arrival_time` (TIME, NULLABLE, COMMENT '预计抵达时间')。
* `total_amount` (DECIMAL(10,2), NOT NULL, COMMENT '订单总金额')。
* `paid_amount` (DECIMAL(10,2), DEFAULT 0.00, COMMENT '已付金额')。
* `due_amount` (DECIMAL(10,2), AS (`total_amount` - `paid_amount`)) STORED COMMENT '应付金额 (计算列)'。
* `currency` (VARCHAR(3), NOT NULL, DEFAULT 'CNY', COMMENT '货币代码')。
* `order_status` (VARCHAR(50), NOT NULL, COMMENT '订单状态。枚举: pending_confirmation, confirmed, checked_in, checked_out, cancelled, no_show, extended, waitlist')。
* `order_source` (VARCHAR(50), NOT NULL, COMMENT '订单来源。枚举: direct_walk_in, direct_phone, direct_website, direct_mall_h5, ota_channel_manager, travel_agency, corporate, other')。
* `notes` (TEXT, NULLABLE, COMMENT '订单备注')。
* `cancelled_at` (DATETIME, NULLABLE, COMMENT '取消时间')。
* `cancellation_reason` (TEXT, NULLABLE, COMMENT '取消原因')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_o_tenant_dept_status_dates` (tenant_id, dept_id, order_status, check_in_date, check_out_date), `idx_pms_o_tenant_dept_contact_phone` (tenant_id, dept_id, primary_contact_phone), `idx_pms_o_tenant_dept_source` (tenant_id, dept_id, order_source)
#### 3.2.5 `pms_core_order_items` - 核心订单项目表
* 业务描述: 记录订单中包含的具体商品或服务项目。
* 主键: `order_item_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `order_item_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '订单项目唯一ID')。
* `order_id` (BIGINT, FK, NOT NULL, COMMENT '所属订单ID, 关联 pms_core_orders.order_id')。
* `dept_id` (BIGINT(20), NOT NULL, COMMENT '部门ID, 关联 sys_dept.dept_id (冗余)')。
* `pms_room_id` (BIGINT, FK, NULLABLE, COMMENT '关联房间ID (如房晚项目), 关联 pms_room_rooms.room_id')。
* `product_id` (BIGINT, FK, NULLABLE, COMMENT '关联产品ID (多态), 如 pms_finance_extra_charge_items.item_id')。
* `product_type` (VARCHAR(50), NOT NULL, COMMENT '产品类型。枚举: room_night (房晚), extra_charge_item (附加收费项目), package_component (套餐子项), service_fee (服务费), discount_adjustment (折扣调整)')。
* `description` (VARCHAR(255), NOT NULL, COMMENT '项目描述 (例如: 豪华大床房住宿, 额外早餐)')。
* `quantity` (INT, NOT NULL, DEFAULT 1, COMMENT '数量')。
* `unit_price` (DECIMAL(10,2), NOT NULL, COMMENT '单价')。
* `total_price` (DECIMAL(10,2), AS (`quantity` * `unit_price`)) STORED COMMENT '总价 (计算列)'。
* `service_date` (DATE, NULLABLE, COMMENT '服务发生日期 (例如房晚对应的日期)')。
* `notes` (TEXT, NULLABLE, COMMENT '项目备注')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_oi_order_id` (order_id), `idx_pms_oi_tenant_dept_product_type` (tenant_id, dept_id, product_type)
#### 3.2.6 `pms_core_channels` - 订单来源渠道表
* 业务描述: 管理订单的来源渠道。
* 主键: `channel_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `channel_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '渠道唯一ID')。
* `dept_id` (BIGINT(20), NULLABLE, COMMENT '部门ID, 关联 sys_dept.dept_id, 若渠道归属特定部门')。
* `name` (VARCHAR(100), NOT NULL, COMMENT '渠道名称 (例如: 携程, 官网直订)')。
* `channel_type` (VARCHAR(50), NOT NULL, COMMENT '渠道类型。枚举: ota, direct_booking (官网/电话/前台), gds (全球分销系统), wholesaler (批发商), corporate (公司协议), internal_use (内部使用), other')。
* `description` (TEXT, NULLABLE, COMMENT '渠道描述')。
* `status` (VARCHAR(50), NOT NULL, DEFAULT 'active', COMMENT '状态。枚举: active (激活), inactive (停用), deprecated (弃用)')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_ch_tenant_dept_name` (tenant_id, dept_id, name), `idx_pms_ch_type` (channel_type), `idx_pms_ch_status` (status)
#### 3.2.7 `pms_finance_folios` - 客户账单(Folio)表
* 业务描述: 记录与订单关联的客户账单核心信息。
* 主键: `folio_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `folio_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '账单唯一ID')。
* `dept_id` (BIGINT(20), NOT NULL, COMMENT '部门ID, 关联 sys_dept.dept_id')。
* `order_id` (BIGINT, UNIQUE, FK, NOT NULL, COMMENT '关联的订单ID, 关联 pms_core_orders.order_id')。
* `total_charges` (DECIMAL(10,2), NOT NULL, DEFAULT 0.00, COMMENT '总应收费用')。
* `total_payments` (DECIMAL(10,2), NOT NULL, DEFAULT 0.00, COMMENT '总已收付款')。
* `total_refunds` (DECIMAL(10,2), NOT NULL, DEFAULT 0.00, COMMENT '总已退款')。
* `balance` (DECIMAL(10,2), AS (`total_charges` - `total_payments` + `total_refunds`)) STORED COMMENT '当前余额 (计算列)'。
* `folio_status` (VARCHAR(50), NOT NULL, DEFAULT 'open', COMMENT '账单状态。枚举: open (开放/未结清), closed (已结清/关闭), void (作废), pending_settlement (待结算)')。
* `notes` (TEXT, NULLABLE, COMMENT '账单备注')。
* `closed_at` (DATETIME, NULLABLE, COMMENT '账单关闭时间')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_f_tenant_dept_order_id` (tenant_id, dept_id, order_id), `idx_pms_f_tenant_dept_status` (tenant_id, dept_id, folio_status)
#### 3.2.8 `pms_finance_transactions` - 财务交易流水表
* 业务描述: 记录在Folio中的每一笔财务交易。
* 主键: `transaction_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `transaction_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '交易唯一ID')。
* `folio_id` (BIGINT, FK, NOT NULL, COMMENT '所属账单ID, 关联 pms_finance_folios.folio_id')。
* `dept_id` (BIGINT(20), NOT NULL, COMMENT '部门ID, 关联 sys_dept.dept_id (冗余)')。
* `transaction_type` (VARCHAR(50), NOT NULL, COMMENT '交易类型。枚举: charge (应收费用), payment (客人付款), refund (退款给客人), deposit (押金), deposit_refund (押金退还), adjustment_positive (正调整), adjustment_negative (负调整)')。
* `amount` (DECIMAL(10,2), NOT NULL, COMMENT '交易金额')。
* `description` (VARCHAR(255), NOT NULL, COMMENT '交易描述')。
* `payment_method_id` (BIGINT, FK, NULLABLE, COMMENT '支付方式ID, 关联 pms_finance_payment_methods.payment_method_id')。
* `payment_gateway_txn_id` (VARCHAR(255), NULLABLE, COMMENT '支付网关交易号')。
* `transaction_time` (DATETIME, NOT NULL, COMMENT '交易实际发生时间')。
* `related_order_item_id` (BIGINT, FK, NULLABLE, COMMENT '关联的订单项ID, 关联 pms_core_order_items.order_item_id')。
* `notes` (TEXT, NULLABLE, COMMENT '交易备注')。
* `is_void` (BOOLEAN, NOT NULL, DEFAULT FALSE, COMMENT '是否已作废冲销')。
* `voided_at` (DATETIME, NULLABLE, COMMENT '作废时间')。
* `voided_reason` (TEXT, NULLABLE, COMMENT '作废原因')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_ft_folio_id` (folio_id), `idx_pms_ft_tenant_dept_type_time` (tenant_id, dept_id, transaction_type, transaction_time), `idx_pms_ft_payment_gateway_txn_id` (payment_gateway_txn_id)
#### 3.2.9 `pms_finance_payment_methods` - 支付方式表
* 业务描述: 存储租户可定义的支付方式。
* 主键: `payment_method_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `payment_method_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '支付方式唯一ID')。
* `dept_id` (BIGINT(20), NULLABLE, COMMENT '部门ID, 关联 sys_dept.dept_id, 若支付方式归属特定部门')。
* `name` (VARCHAR(100), NOT NULL, COMMENT '支付方式名称 (例如: 现金, 微信支付)')。
* `method_type` (VARCHAR(50), NOT NULL, COMMENT '支付方式类型。枚举: cash, credit_card_visa, credit_card_mastercard, credit_card_amex, alipay, wechat_pay, bank_transfer, company_account, voucher, points, other_online_payment, mobile_payment, other')。
* `details_json` (JSON, NULLABLE, COMMENT '支付方式附加配置。例如支付网关参数等')。
* `status` (VARCHAR(50), NOT NULL, DEFAULT 'active', COMMENT '状态。枚举: active (激活), inactive (停用)')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_fpm_tenant_dept_name` (tenant_id, dept_id, name), `idx_pms_fpm_tenant_dept_type` (tenant_id, dept_id, method_type), `idx_pms_fpm_tenant_dept_status` (tenant_id, dept_id, status)
#### 3.2.10 `pms_finance_extra_charge_items` - 附加费用项目表
* 业务描述: 存储租户可预定义的附加消费项目,如额外早餐、加床费等。
* 主键: `item_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `item_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '附加费用项目唯一ID')。
* `dept_id` (BIGINT(20), NULLABLE, COMMENT '部门ID, 关联 sys_dept.dept_id, 若项目归属特定部门')。
* `name` (VARCHAR(255), NOT NULL, COMMENT '项目名称')。
* `default_price` (DECIMAL(10,2), NOT NULL, COMMENT '默认单价')。
* `category` (VARCHAR(100), NULLABLE, COMMENT '费用类别,如餐饮、服务、商品等')。
* `is_taxable` (BOOLEAN, NOT NULL, DEFAULT TRUE, COMMENT '是否应税')。
* `description` (TEXT, NULLABLE, COMMENT '项目描述')。
* `status` (VARCHAR(50), NOT NULL, DEFAULT 'active', COMMENT '状态。枚举: active (激活), inactive (停用)')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_feci_tenant_dept_name` (tenant_id, dept_id, name), `idx_pms_feci_tenant_dept_category` (tenant_id, dept_id, category), `idx_pms_feci_tenant_dept_status` (tenant_id, dept_id, status)
#### 3.2.11 `pms_room_pricing_rules` - 房间价格规则表
* 业务描述: 为特定房型在特定日期范围或特定条件下设置价格调整规则。
* 主键: `rule_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `rule_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '价格规则唯一ID')。
* `dept_id` (BIGINT(20), NULLABLE, COMMENT '部门ID, 关联 sys_dept.dept_id, 若规则归属特定部门')。
* `name` (VARCHAR(255), NOT NULL, COMMENT '规则名称 (例如: 周末特价, 连住优惠)')。
* `room_type_id` (BIGINT, FK, NULLABLE, COMMENT '适用的房型ID, 关联 pms_room_types.room_type_id, NULL表示适用于所有房型')。
* `date_range_start` (DATE, NULLABLE, COMMENT '规则适用开始日期')。
* `date_range_end` (DATE, NULLABLE, COMMENT '规则适用结束日期')。
* `days_of_week_json` (JSON, NULLABLE, COMMENT 'JSON数组数字代表星期几, e.g., [1,2,7] (1-Mon, 7-Sun)')。
* `min_length_of_stay` (INT, NULLABLE, COMMENT '最小入住天数要求')。
* `max_length_of_stay` (INT, NULLABLE, COMMENT '最大入住天数限制')。
* `price_adjustment_type` (VARCHAR(50), NOT NULL, COMMENT '调整类型。枚举: fixed_amount_override (固定价格覆盖), percentage_discount_from_base (基价百分比折扣), fixed_amount_increase_on_base (基价固定金额上浮), fixed_amount_decrease_from_base (基价固定金额下调), set_to_value (设置为特定值)')。
* `adjustment_value` (DECIMAL(10,2), NOT NULL, COMMENT '调整值 (具体金额或百分比如50.00或0.1代表10%)')。
* `priority` (INT, NOT NULL, DEFAULT 0, COMMENT '规则优先级,数字越大优先级越高')。
* `status` (VARCHAR(50), NOT NULL, DEFAULT 'active', COMMENT '状态。枚举: active (激活), inactive (停用), scheduled (计划中)')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 索引: `idx_pms_rpr_tenant_dept_dates` (tenant_id, dept_id, date_range_start, date_range_end), `idx_pms_rpr_tenant_dept_status_priority` (tenant_id, dept_id, status, priority)
#### 3.2.12 `pms_tenant_user_devices` - 租户用户设备表
* 业务描述: 用于存储租户用户(员工)登录过的设备信息,主要用于推送通知。
* 主键: `id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '设备记录唯一ID')。
* `user_id` (BIGINT(20), FK, NOT NULL, COMMENT '关联的用户ID, 关联 sys_user.user_id')。
* `device_type` (VARCHAR(50), NOT NULL, COMMENT '设备类型,例如: ios_app, android_app, wechat_miniprogram, web_push_browser')。
* `device_token` (VARCHAR(512), NOT NULL, COMMENT '设备推送令牌')。
* `app_version` (VARCHAR(50), NULLABLE, COMMENT '客户端应用版本')。
* `last_login_at` (DATETIME, NOT NULL, COMMENT '此设备最后登录时间')。
* `status` (VARCHAR(50), NOT NULL, DEFAULT 'active', COMMENT '状态。枚举: active (激活), inactive (停用), token_expired (令牌过期)')。
* `create_time` (DATETIME, NOT NULL, COMMENT '记录创建时间')。
* `update_time` (DATETIME, NOT NULL, COMMENT '记录更新时间')。
* 唯一约束: `unq_pms_ud_user_device_token_type` (user_id, device_token, device_type)
* 索引: `idx_pms_ud_tenant_user_token` (tenant_id, user_id, device_token), `idx_pms_ud_user_status` (user_id, status)
#### 3.2.13 `pms_tenant_settings` - 租户级PMS特定设置表
* 业务描述: 存储租户或部门级别的PMS特定业务配置项。与若依的 `sys_config` 互补。
* 主键: `setting_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `setting_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '设置唯一ID')。
* `tenant_id` (VARCHAR(20), NOT NULL, COMMENT '租户编号, 关联 sys_tenant.tenant_id')。
* `dept_id` (BIGINT(20), NULLABLE, COMMENT '部门ID, 关联 sys_dept.dept_id, NULL表示租户全局PMS设置')。
* `setting_group` (VARCHAR(100), NOT NULL, COMMENT '设置分组,例如: pms_booking_rules, pms_financial_params, pms_ui_appearance')。
* `setting_key` (VARCHAR(100), NOT NULL, COMMENT '设置项的唯一键 (在tenant_id, dept_id, setting_group下唯一)')。
* `setting_value` (TEXT, NOT NULL, COMMENT '设置项的值 (根据需要可存储JSON字符串)')。
* `value_type` (VARCHAR(50), NOT NULL, DEFAULT 'string', COMMENT '值类型,如 string, integer, boolean, json方便解析')。
* `description` (TEXT, NULLABLE, COMMENT '设置项描述')。
* `is_sensitive` (BOOLEAN, NOT NULL, DEFAULT FALSE, COMMENT '是否为敏感设置')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 唯一约束: `unq_pms_ts_tenant_dept_group_key` (tenant_id, dept_id, setting_group, setting_key, del_flag)
* 索引: `idx_pms_ts_tenant_dept_group_key` (tenant_id, dept_id, setting_group, setting_key)
#### 3.2.14 `pms_mp_settings` - 民宿管理小程序配置表
* 业务描述: 存储租户或部门级别针对民宿员工管理小程序的特定配置项。
* 主键: `setting_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `setting_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '小程序设置唯一ID')。
* `tenant_id` (VARCHAR(20), NOT NULL, COMMENT '租户编号, 关联 sys_tenant.tenant_id')。
* `dept_id` (BIGINT(20), NULLABLE, COMMENT '部门ID, 关联 sys_dept.dept_id, NULL表示租户全局小程序设置')。
* `setting_key` (VARCHAR(100), NOT NULL, COMMENT '小程序配置项的唯一键。例如: mp_theme_color, mp_enable_feature_xyz')。
* `setting_value` (TEXT, NOT NULL, COMMENT '配置项的值 (可存储JSON字符串)')。
* `value_type` (VARCHAR(50), NOT NULL, DEFAULT 'string', COMMENT '值类型,如 string, integer, boolean, json')。
* `description` (TEXT, NULLABLE, COMMENT '配置项描述')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 唯一约束: `unq_pms_mps_tenant_dept_key` (tenant_id, dept_id, setting_key, del_flag)
* 索引: `idx_pms_mps_tenant_dept_key` (tenant_id, dept_id, setting_key)
### 3.3 公共数据模型 (PMS相关)
#### 3.3.1 `cmn_contacts` - 联系人表
* 业务描述: 存储系统中所有类型的联系人信息主要是PMS的住客。
* 主键: `contact_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `contact_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '联系人唯一ID')。
* `dept_id` (BIGINT(20), NULLABLE, COMMENT '部门ID, 关联 sys_dept.dept_id, 若联系人主要归属某部门')。
* `contact_type` (VARCHAR(50), NOT NULL, COMMENT '联系人类型。枚举: guest_individual (散客), guest_group_contact (团队联系人), corporate_contact (公司协议联系人), travel_agent_contact (旅行社联系人), company_profile (公司档案), supplier_contact (供应商联系人), employee_profile (员工档案关联), other (其他)')。
* `full_name` (VARCHAR(255), NULLABLE, COMMENT '姓名')。
* `phone_number` (VARCHAR(50), NULLABLE, COMMENT '主要联系电话')。
* `email` (VARCHAR(255), NULLABLE, COMMENT '电子邮件地址')。
* `wechat_openid` (VARCHAR(100), NULLABLE, COMMENT '微信OpenID (特定于单个微信公众号或小程序)')。
* `wechat_unionid` (VARCHAR(100), NULLABLE, COMMENT '微信UnionID (跨多个微信应用的用户唯一标识)')。
* `related_user_id` (BIGINT(20), FK, NULLABLE, COMMENT '关联的系统用户ID, 关联 sys_user.user_id, 如员工档案关联')。
* `gender` (VARCHAR(20), NULLABLE, COMMENT '性别。枚举: male (男), female (女), non_binary (非二元), prefer_not_to_say (不愿透露), unknown (未知)')。
* `date_of_birth` (DATE, NULLABLE, COMMENT '出生日期')。
* `id_type` (VARCHAR(50), NULLABLE, COMMENT '证件类型如身份证、护照等。可关联sys_dict_data')。
* `id_number_encrypted` (VARCHAR(255), NULLABLE, COMMENT '证件号码 (加密存储)')。
* `nationality_country_code` (VARCHAR(10), NULLABLE, COMMENT '国籍代码 (ISO 3166-1 alpha-2)')。
* `preferred_language` (VARCHAR(10), NULLABLE, COMMENT '偏好语言代码 (e.g., en, zh-CN)')。
* `address_street` (VARCHAR(255), NULLABLE, COMMENT '街道地址')。
* `address_city` (VARCHAR(100), NULLABLE, COMMENT '城市')。
* `address_state_province` (VARCHAR(100), NULLABLE, COMMENT '省/州')。
* `address_postal_code` (VARCHAR(50), NULLABLE, COMMENT '邮政编码')。
* `address_country_code` (VARCHAR(10), NULLABLE, COMMENT '国家代码 (ISO 3166-1 alpha-2)')。
* `contact_status` (VARCHAR(50), NOT NULL, DEFAULT 'active', COMMENT '联系人状态。枚举: active (活跃), inactive (不活跃), prospect (潜在客户), blacklisted (黑名单), pending_verification (待验证), merged_duplicate (已合并重复)')。
* `remarks` (TEXT, NULLABLE, COMMENT '备注信息')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 唯一约束 (建议,考虑 `del_flag`):
* `unq_cmn_c_tenant_dept_phone` (tenant_id, dept_id, phone_number, del_flag) (如果电话在部门内唯一)
* `unq_cmn_c_tenant_dept_email` (tenant_id, dept_id, email, del_flag) (如果邮箱在部门内唯一)
* 索引: `idx_cmn_c_tenant_dept_fname` (tenant_id, dept_id, full_name), `idx_cmn_c_tenant_dept_status_type` (tenant_id, dept_id, contact_status, contact_type), `idx_cmn_c_related_user` (related_user_id)
#### 3.3.2 `cmn_contact_tags` - 联系人标签表
* 业务描述: 定义可用于分类和标记联系人的标签。
* 主键: `tag_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `tag_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '标签唯一ID')。
* `dept_id` (BIGINT(20), NULLABLE, COMMENT '部门ID, 关联 sys_dept.dept_id, 若标签归属特定部门或全局')。
* `name` (VARCHAR(100), NOT NULL, COMMENT '标签名称')。
* `color` (VARCHAR(20), NULLABLE, COMMENT '标签显示颜色,如十六进制色值 #FF5733')。
* `category` (VARCHAR(50), NULLABLE, COMMENT '标签分类,如兴趣、客户级别、来源等')。
* `description` (TEXT, NULLABLE, COMMENT '标签描述')。
* `is_system` (BOOLEAN, NOT NULL, DEFAULT FALSE, COMMENT '是否为系统预设标签 (不可删除)')。
* `sort_order` (INT, NOT NULL, DEFAULT 0, COMMENT '排序值')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NULLABLE, COMMENT '创建时间')。
* `update_by` (BIGINT(20), NULLABLE, COMMENT '更新者ID, 关联 sys_user.user_id')。
* `update_time` (DATETIME, NULLABLE, COMMENT '更新时间')。
* `create_dept_id` (BIGINT(20), NULLABLE, COMMENT '创建部门ID, 关联 sys_dept.dept_id')。
* `del_flag` (CHAR(1), NOT NULL, DEFAULT '0', COMMENT '删除标志0存在 1删除')。
* 唯一约束: `unq_cmn_ct_tenant_dept_name_category` (tenant_id, dept_id, name, category, del_flag)
* 索引: `idx_cmn_ct_category` (category), `idx_cmn_ct_is_system` (is_system)
#### 3.3.3 `cmn_contact_tag_relations` - 联系人标签关联表
* 业务描述: 实现联系人与标签的多对多关系。
* 主键: `relation_id` (BIGINT AUTO_INCREMENT)
* 字段定义:
* `relation_id` (BIGINT, PK, AUTO_INCREMENT, NOT NULL, COMMENT '关联唯一ID')。
* `dept_id` (BIGINT(20), NOT NULL, COMMENT '部门ID, 关联 sys_dept.dept_id (冗余, 以联系人所属部门为准)')。
* `contact_id` (BIGINT, FK, NOT NULL, COMMENT '联系人ID, 关联 cmn_contacts.contact_id')。
* `tag_id` (BIGINT, FK, NOT NULL, COMMENT '标签ID, 关联 cmn_contact_tags.tag_id')。
* `create_by` (BIGINT(20), NULLABLE, COMMENT '创建者ID, 关联 sys_user.user_id')。
* `create_time` (DATETIME, NOT NULL, COMMENT '创建时间')。
* 唯一约束: `unq_cmn_ctr_tenant_dept_contact_tag` (tenant_id, dept_id, contact_id, tag_id)
* 索引: `idx_cmn_ctr_contact_id` (contact_id), `idx_cmn_ctr_tag_id` (tag_id)
## 4. 主要业务实体状态流转
#### 4.1 订单 (`pms_core_orders`) 状态流转
```mermaid
stateDiagram-v2
[*] --> pending_confirmation: 创建订单
pending_confirmation --> confirmed: 确认订单
pending_confirmation --> cancelled: 取消订单
confirmed --> checked_in: 办理入住
confirmed --> cancelled: 取消订单
confirmed --> no_show: 未按时入住
checked_in --> checked_out: 办理退房
checked_in --> extended: 延长入住
extended --> checked_out: 办理退房
checked_out --> [*] : 订单完成
cancelled --> [*] : 订单取消
no_show --> [*] : 订单标记为No Show
```
* **订单状态 (`order_status` VARCHAR(50)) 枚举值示例:**
* `pending_confirmation` (待确认)
* `confirmed` (已确认)
* `checked_in` (已入住)
* `checked_out` (已退房)
* `cancelled` (已取消)
* `no_show` (未到店)
* `extended` (已延期)
* `waitlist` (等候名单)
#### 4.2 房间 (`pms_room_rooms`) 状态流转 (物理状态 & 清洁状态)
**物理状态 (`room_status` VARCHAR(50))**
```mermaid
stateDiagram-v2
[*] --> available: 房间空闲可用
available --> occupied: 客人入住 / 预留占用
available --> maintenance: 安排维护 / 维修
available --> out_of_service: 暂停服务 (其他原因)
occupied --> available: 客人退房 (且房间已清洁完成)
maintenance --> available: 维护完成 (房间恢复可用)
out_of_service --> available: 恢复服务
```
* **物理状态枚举值示例:**
* `available` (可用)
* `occupied` (占用中)
* `maintenance` (维护中)
* `out_of_service` (暂停服务)
**清洁状态 (`cleaning_status` VARCHAR(50))**
```mermaid
stateDiagram-v2
[*] --> clean: 初始状态 / 清洁完成
clean --> dirty: 客人使用后 / 退房后标记
dirty --> cleaning_in_progress: 客房服务员开始清洁
cleaning_in_progress --> inspected: 清洁完成待查房
inspected --> clean: 查房通过
inspected --> cleaning_in_progress: 查房未通过,返工
clean --> cleaning_in_progress: 客中打扫 (客人仍在住,但安排了打扫)
```
* **清洁状态枚举值示例:**
* `clean` (已清洁)
* `dirty` (待清洁)
* `cleaning_in_progress` (清洁中)
* `inspected` (已查房/待检)
#### 4.3 账单 (`pms_finance_folios`) 状态流转
```mermaid
stateDiagram-v2
[*] --> open: 订单创建时自动生成 / 手动创建
open --> closed: 账务结清 (所有费用付清)
open --> void: 作废账单 (如错误创建)
open --> pending_settlement: 等待结算 (如对公转账)
pending_settlement --> closed: 结算完成
pending_settlement --> open: 取消结算,返回开放
closed --> open: 重新打开 (特殊情况,需权限,如补充入账或退款)
void --> [*] : 账单作废
closed --> [*] : 账单关闭
```
* **账单状态 (`folio_status` VARCHAR(50)) 枚举值示例:**
* `open` (开放/未结清)
* `closed` (已结清/关闭)
* `void` (作废)
* `pending_settlement` (待结算)
## 5. 核心业务枚举值定义 (PMS主要部分)
以下列出PMS核心业务表中 `VARCHAR(50)` 类型枚举字段的建议值,具体值可根据业务细化调整。
* **`pms_room_types.status`**: `active` (启用), `inactive` (禁用)
* **`pms_room_rooms.room_status`**: `available` (可用), `occupied` (占用中), `maintenance` (维护中), `out_of_service` (暂停服务)
* **`pms_room_rooms.cleaning_status`**: `clean` (已清洁), `dirty` (待清洁), `cleaning_in_progress` (清洁中), `inspected` (已查房/待检)
* **`pms_room_rooms.status` (记录状态)**: `active` (启用), `inactive` (禁用)
* **`pms_room_locks.lock_type`**: `manual_lock` (手动锁定), `maintenance` (维护), `auto_block` (自动锁定,如欠费), `staff_use` (员工自用), `cleaning_block` (清洁锁定)
* **`pms_core_orders.order_status`**: `pending_confirmation` (待确认), `confirmed` (已确认), `checked_in` (已入住), `checked_out` (已退房), `cancelled` (已取消), `no_show` (未到店), `extended` (已延期), `waitlist` (等候名单), `provisional` (暂定预订)
* **`pms_core_orders.order_source`**: `direct_walk_in` (现场步入), `direct_phone` (电话预订), `direct_website` (官网预订), `direct_mall_h5` (H5商城), `ota_channel_manager` (OTA渠道管理), `travel_agency` (旅行社), `corporate_account` (公司协议), `internal_booking` (内部预订), `other` (其他)
* **`pms_core_order_items.product_type`**: `room_night` (房晚), `extra_charge_item` (附加收费项目), `package_component` (套餐子项), `service_fee` (服务费), `discount_adjustment` (折扣调整), `cancellation_fee` (取消费)
* **`pms_core_channels.channel_type`**: `ota` (在线旅行社), `direct_booking` (直接预订-官网/电话/前台), `gds` (全球分销系统), `wholesaler` (批发商), `corporate` (公司协议), `internal_use` (内部使用), `meta_search` (元搜索), `other` (其他)
* **`pms_core_channels.status`**: `active` (激活), `inactive` (停用), `deprecated` (弃用)
* **`pms_finance_folios.folio_status`**: `open` (开放/未结清), `closed` (已结清/关闭), `void` (作废), `pending_settlement` (待结算)
* **`pms_finance_transactions.transaction_type`**: `charge` (应收费用), `payment` (客人付款), `refund` (退款给客人), `deposit` (押金收款), `deposit_refund` (押金退还), `adjustment_positive` (正调整), `adjustment_negative` (负调整), `folio_transfer_out` (转出), `folio_transfer_in` (转入)
* **`pms_finance_payment_methods.method_type`**: `cash` (现金), `credit_card_visa` (VISA卡), `credit_card_mastercard` (万事达卡), `credit_card_amex` (运通卡), `credit_card_unionpay` (银联卡), `alipay` (支付宝), `wechat_pay` (微信支付), `bank_transfer` (银行转账), `company_account` (公司账户/挂账), `voucher` (代金券), `points_redemption` (积分兑换), `other_online_payment` (其他在线支付), `mobile_payment` (其他移动支付), `other` (其他)
* **`pms_finance_payment_methods.status`**: `active` (激活), `inactive` (停用)
* **`pms_finance_extra_charge_items.status`**: `active` (激活), `inactive` (停用)
* **`pms_room_pricing_rules.price_adjustment_type`**: `fixed_amount_override` (固定价格覆盖), `percentage_discount_from_base` (基价百分比折扣), `fixed_amount_increase_on_base` (基价固定金额上浮), `fixed_amount_decrease_from_base` (基价固定金额下调), `set_to_value` (设置为特定值)
* **`pms_room_pricing_rules.status`**: `active` (激活), `inactive` (停用), `scheduled` (计划中/待生效)
* **`pms_tenant_user_devices.status`**: `active` (激活), `inactive` (停用), `token_expired` (令牌过期)
* **`cmn_contacts.contact_type`**: `guest_individual` (散客), `guest_group_contact` (团队联系人), `corporate_contact` (公司协议联系人), `travel_agent_contact` (旅行社联系人), `company_profile` (公司档案), `supplier_contact` (供应商联系人), `employee_profile` (员工档案关联), `other` (其他)
* **`cmn_contacts.gender`**: `male` (男), `female` (女), `non_binary` (非二元性别), `prefer_not_to_say` (不愿透露), `unknown` (未知)
* **`cmn_contacts.contact_status`**: `active` (活跃), `inactive` (不活跃), `prospect` (潜在客户), `blacklisted` (黑名单), `pending_verification` (待验证), `merged_duplicate` (已合并重复档案)
## 6. 索引命名与规范建议
* **唯一索引:** `unq_[子系统前缀]_[表名简写]_[字段1]_[字段2]`,例如:`unq_pms_r_tdrn` 代表 `pms_room_rooms` 表上 `tenant_id, dept_id, room_number` 的唯一索引。
* **普通索引:** `idx_[子系统前缀]_[表名简写]_[字段1]_[字段2]`,例如:`idx_pms_o_tds` 代表 `pms_core_orders` 表上 `tenant_id, dept_id, order_status` 的普通索引。
* **租户和部门优先:** 对于所有包含 `tenant_id``dept_id` 的PMS业务表查询相关的索引应优先考虑这两个字段顺序通常为 `(tenant_id, dept_id, ...其他条件字段)`
* **覆盖索引:** 尽量设计覆盖索引以减少回表,提高查询性能。
* **避免过多索引:** 每个表的索引数量不宜过多,以免影响写入性能。
---
**(文档末尾)**
**重要提示:**
* 本文档中的主键类型已统一为 `BIGINT AUTO_INCREMENT` (用于PMS新增业务表) 或遵循若依原有的 `BIGINT` (用于若依系统表)。
* PMS业务表中的枚举字段统一为 `VARCHAR(50)`,这与若依的 `CHAR(1)` 不同在系统集成和前端交互时可能需要在API层或逻辑层进行适配和转换。
* 所有PMS业务表已添加 `dept_id` 字段,用于数据归属和统计。确保所有相关查询和业务逻辑都考虑到 `dept_id`
* 审计字段和软删除标记已尽量对齐若依规范。
请仔细审查此最终方案,确保其满足所有业务需求和技术约束。