## 云宿居 PMS 系统 - PMS核心数据模型 (最终版 v5.7) **快速导航:** - [1. 引言](#1-引言) - [2. PMS 核心E-R图 (最终版)](#2-pms-核心er图-最终版) - [3. 表结构定义](#3-表结构定义) - [3.1 SaaS平台与系统基础表 (源自若依)](#31-saas平台与系统基础表-源自若依) - [3.2 客户管理表 (租户级共享/门店级)](#32-客户管理表-租户级共享门店级) - [3.3 房间管理表 (门店级隔离)](#33-房间管理表-门店级隔离) - [3.4 价格管理表 (门店级隔离)](#34-价格管理表-门店级隔离) - [3.5 订单管理表 (门店级隔离)](#35-订单管理表-门店级隔离) - [3.6 财务管理表 (门店级隔离)](#36-财务管理表-门店级隔离) - [3.7 合作方管理表 (全局共享/租户级)](#37-合作方管理表-全局共享租户级) - [3.8 系统配置表 (租户级/门店级)](#38-系统配置表-租户级门店级) - [4. 主要业务实体状态流转](#4-主要业务实体状态流转) - [5. 核心业务枚举值定义](#5-核心业务枚举值定义) - [6. 数据权限控制与索引设计](#6-数据权限控制与索引设计) - [7. 版本变更记录](#7-版本变更记录) ## 1. 引言 ### 1.1 文档目的与范围 本文档详细定义了"云宿居"民宿 Property Management System (PMS) 的数据库逻辑模型,并与其依赖的若依框架的基础表(如租户、用户、部门等)进行了整合。本文档旨在为数据库的物理实现和后端开发提供具体指导。 **核心原则:** 1. 若依框架的基础实体(用户、租户、角色、部门等)及其字段规范固定不变。 2. PMS新增的核心业务表主键统一采用 `BIGINT` 自增ID。 3. **所有PMS业务表都包含 `tenant_id` 字段,支持标准多租户拦截器自动过滤。** 4. **数据隔离层级:** - 租户级隔离:客户信息在租户内共享,使用 `tenant_id` 标准多租户拦截器 - 门店级隔离:订单、房间、财务等核心业务数据按门店隔离,包含 `dept_id` 字段 - 门店级共享:客户标签使用 `dept_id`,可设为NULL实现租户级共享 5. **多租户拦截器排除原则:仅排除系统级全局表和特殊处理表** 6. PMS业务表中的枚举字段,统一使用 `VARCHAR(50)` 存储描述性字符串以增强可读性和扩展性。 ### 1.2 命名与设计约定 * **表命名:** `pms_` (PMS核心业务表)。若依表使用其原生 `sys_` 前缀。 * **字段命名:** `snake_case` (小写下划线)。 * **主键 (PK):** * PMS核心业务实体: `BIGINT AUTO_INCREMENT`。 * 日志类高频写入表: `BIGINT AUTO_INCREMENT`。 * **租户ID `tenant_id`:** `VARCHAR(20)` (同 `sys_tenant.tenant_id`),在PMS业务表中非空。 * **部门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` (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 {} sys_dept {} sys_user {} %% --- 客户与合作方表 --- pms_customer_contacts {} pms_contact_tags {} pms_contact_tag_relations {} pms_suppliers {} pms_partners {} %% --- PMS Core Business Tables (门店级隔离) --- pms_room_types {} pms_room_rooms {} pms_room_locks {} pms_core_orders {} pms_order_status_history {} pms_order_guests {} pms_core_order_items {} pms_core_channels {} pms_finance_folios {} pms_finance_transactions {} pms_finance_payment_methods {} pms_finance_extra_charge_items {} pms_room_pricing_rules {} pms_pricing_calculations {} pms_special_date_pricing {} pms_room_inventory_snapshot {} %% --- 系统配置相关表 --- pms_tenant_settings {} pms_mp_settings {} pms_tenant_user_devices {} %% --- 若依基础表关联 --- sys_tenant ||--o{ sys_dept : "包含门店/部门" sys_tenant ||--o{ sys_user : "的主要租户" sys_dept ||--o{ sys_user : "员工属于门店" %% --- 客户相关表关联 --- sys_tenant ||--o{ pms_customer_contacts : "拥有客户联系人" pms_customer_contacts ||--o{ pms_contact_tag_relations : "联系人标签关联" pms_contact_tags ||--o{ pms_contact_tag_relations : "标签关联联系人" sys_tenant ||--o{ pms_contact_tags : "拥有标签" sys_dept ||--o{ pms_contact_tags : "门店级标签" %% --- 供应商合作伙伴关联 --- sys_tenant ||--o{ pms_suppliers : "拥有供应商" sys_tenant ||--o{ pms_partners : "拥有合作伙伴" %% --- PMS 表关联到若依基础表 --- sys_tenant ||--o{ pms_room_types : "定义房型" sys_tenant ||--o{ pms_core_orders : "拥有订单" sys_tenant ||--o{ pms_finance_folios : "拥有账单" sys_dept ||--o{ pms_room_types : "门店房型" sys_dept ||--o{ pms_room_rooms : "门店房间" sys_dept ||--o{ pms_core_orders : "门店订单" sys_dept ||--o{ pms_tenant_settings : "门店配置" sys_dept ||--o{ pms_mp_settings : "门店小程序配置" 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_types ||--o{ pms_pricing_calculations : "价格计算记录" pms_room_types o|--o{ pms_special_date_pricing : "特殊日期价格" pms_room_types ||--o{ pms_room_inventory_snapshot : "库存快照" 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 : "生成账单" pms_core_orders ||--o{ pms_order_status_history : "状态变更历史" pms_core_orders ||--o{ pms_order_guests : "入住客人信息" pms_customer_contacts o|--o{ pms_core_orders : "是主要客户" pms_core_channels o|--o{ pms_core_orders : "是来源渠道" pms_core_channels o|--o{ pms_pricing_calculations : "价格计算渠道" 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 : "可以是附加项" ``` ## 3. 表结构定义 ### 3.1 SaaS平台与系统基础表 (源自若依) 这些表结构直接采用若依框架的定义,关键表包括: * `sys_tenant`: 租户表 (业务主键 `tenant_id varchar(20)`) * `sys_dept`: 部门表 (主键 `dept_id bigint(20)`),在本系统中作为门店/分店使用 * `sys_user`: 用户信息表 (主键 `user_id bigint(20)`) * `sys_role`: 角色信息表 (主键 `role_id bigint(20)`) * 其他若依系统表按原规范使用 ### 3.2 客户管理表 (租户级共享/门店级) #### 3.2.1 `pms_customer_contacts` - 客户联系人表 * 业务描述: 存储租户级共享的客户联系人信息,包括个人客户、团队联系人、企业客户、会员等。 * 数据隔离: **租户级共享,使用标准多租户拦截器,租户内所有门店可见** * 主键: `contact_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `contact_id` - 联系人唯一ID * `tenant_id` - 租户ID (多租户拦截器自动过滤) * `contact_type` - 联系人类型 (individual_guest/group_leader/corporate_contact/vip_member/repeat_guest/marketing_tag/behavior_tag) * `full_name` - 联系人姓名 * `phone_number` - 主要联系电话 * `email` - 电子邮件地址 * `wechat_openid` - 微信OpenID * `wechat_unionid` - 微信UnionID * `gender` - 性别 * `date_of_birth` - 出生日期 * `id_type` - 证件类型 * `id_number_encrypted` - 证件号码 (加密存储) * `nationality_country_code` - 国籍代码 * `address_province` - 地址-省份 * `address_city` - 地址-城市 * `address_district` - 地址-区县 * `address_detail` - 地址-详细地址 * `postal_code` - 邮政编码 * `contact_status` - 联系人状态 (active/inactive/blacklisted/pending_verification) * `member_level` - 会员等级 * `total_stays` - 总入住次数 * `total_amount` - 总消费金额 (DECIMAL(10,2)) * `last_stay_date` - 最后入住日期 * `remarks` - 备注信息 * `create_dept` - 创建部门 (BIGINT, 关联sys_dept.dept_id) * `create_by` - 创建者 (BIGINT) * `create_time` - 创建时间 (DATETIME) * `update_by` - 更新者 (BIGINT) * `update_time` - 更新时间 (DATETIME) * `del_flag` - 删除标志 (CHAR(1) DEFAULT '0' NOT NULL) * 索引设计: * `idx_pms_cc_tenant` (tenant_id) * `idx_pms_cc_tenant_name` (tenant_id, full_name) * `idx_pms_cc_tenant_phone` (tenant_id, phone_number) * `idx_pms_cc_tenant_status_type` (tenant_id, contact_status, contact_type) #### 3.2.2 `pms_contact_tags` - 联系人标签表 * 业务描述: 存储客户联系人标签信息,支持门店级或租户级标签。 * 数据隔离: **使用标准多租户拦截器,dept_id为NULL时表示租户级标签** * 主键: `tag_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `tag_id` - 标签唯一ID * `tenant_id` - 租户ID (多租户拦截器自动过滤) * `dept_id` - 部门ID (NULL表示租户级标签,非NULL表示门店级标签) * `name` - 标签名称 * `color` - 标签显示颜色 * `category` - 标签分类 (contact_level/contact_source/contact_preference/service_record/marketing_tag/behavior_tag) * `description` - 标签描述 * `is_system` - 是否为系统预设标签 * `sort_order` - 排序值 * `create_dept` - 创建部门 (BIGINT, 关联sys_dept.dept_id) * `create_by` - 创建者 (BIGINT) * `create_time` - 创建时间 (DATETIME) * `update_by` - 更新者 (BIGINT) * `update_time` - 更新时间 (DATETIME) * `del_flag` - 删除标志 (CHAR(1) DEFAULT '0' NOT NULL) * 索引设计: * `idx_pms_ct_tenant_dept` (tenant_id, dept_id) * `idx_pms_ct_tenant_dept_name_category` (tenant_id, dept_id, name, category) * `idx_pms_ct_category` (category) #### 3.2.3 `pms_contact_tag_relations` - 联系人标签关联表 * 业务描述: 存储客户联系人与标签的关联关系。 * 数据隔离: **使用标准多租户拦截器** * 主键: `relation_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `relation_id` - 关联唯一ID * `tenant_id` - 租户ID (多租户拦截器自动过滤) * `contact_id` - 联系人ID (关联 pms_customer_contacts.contact_id) * `tag_id` - 标签ID (关联 pms_contact_tags.tag_id) * `create_dept` - 创建部门 (BIGINT, 关联sys_dept.dept_id) * `create_by` - 创建者 (BIGINT) * `create_time` - 创建时间 (DATETIME) * `del_flag` - 删除标志 (CHAR(1) DEFAULT '0' NOT NULL) * 索引设计: * `idx_pms_ctr_tenant_contact` (tenant_id, contact_id) * `idx_pms_ctr_tenant_tag` (tenant_id, tag_id) * `idx_pms_ctr_contact_id` (contact_id) * `idx_pms_ctr_tag_id` (tag_id) * UNIQUE KEY `unq_pms_ctr_tenant_contact_tag` (tenant_id, contact_id, tag_id, del_flag) ### 3.3 房间管理表 (门店级隔离) #### 3.3.1 `pms_room_types` - 房型表 * 业务描述: 存储各门店定义的房型信息。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `room_type_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `room_type_id` - 房型唯一ID * `tenant_id` - 租户ID (多租户拦截器使用) * `dept_id` - 部门ID (门店级权限控制, 关联 sys_dept.dept_id) * `type_name` - 房型名称 * `type_code` - 房型代码 * `description` - 房型描述 * `standard_occupancy` - 标准入住人数 * `max_occupancy` - 最大入住人数 * `room_area` - 房间面积(平方米) (DECIMAL(8,2)) * `bed_configuration` - 床型配置 * `amenities` - 房间设施 * `default_price` - 默认价格 (DECIMAL(10,2)) * `status` - 房型状态 (active/inactive/maintenance) * `sort_order` - 排序值 * `images` - 房型图片 * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_room_type_tenant` (tenant_id) * `idx_room_type_dept` (dept_id) * `idx_room_type_status` (status) * `uk_room_type_code_dept` (type_code, dept_id, del_flag) -- 唯一约束 #### 3.3.2 `pms_room_rooms` - 房间表 * 业务描述: 存储各门店的具体房间信息。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `room_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `room_id` - 房间唯一ID * `tenant_id` - 租户ID (多租户拦截器使用) * `dept_id` - 部门ID (门店级权限控制, 关联 sys_dept.dept_id) * `room_type_id` - 房型ID (关联 pms_room_types.room_type_id) * `room_number` - 房间号 * `floor` - 楼层 * `room_status` - 房间物理状态 (available/occupied/maintenance/out_of_order) * `cleaning_status` - 清洁状态 (clean/dirty/cleaning/inspecting) * `description` - 房间描述 * `special_amenities` - 房间特殊设施 * `last_cleaning_time` - 最后清洁时间 * `last_maintenance_time` - 最后维护时间 * `status_remarks` - 房间状态备注 * `sort_order` - 排序值 * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_room_tenant` (tenant_id) * `idx_room_dept` (dept_id) * `idx_room_type` (room_type_id) * `idx_room_status` (room_status) * `idx_room_cleaning` (cleaning_status) * `uk_room_number_dept` (room_number, dept_id, del_flag) -- 同门店房间号唯一 * 外键约束: * `fk_room_room_type` FOREIGN KEY (room_type_id) REFERENCES pms_room_types(room_type_id) #### 3.3.3 `pms_room_locks` - 房间锁定表 * 业务描述: 存储房间锁定记录,支持维护、清洁、管理等多种锁定类型。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `lock_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `lock_id` - 锁定记录唯一ID * `tenant_id` - 租户ID (多租户拦截器使用) * `dept_id` - 部门ID (门店级权限控制, 关联 sys_dept.dept_id) * `room_id` - 房间ID (关联 pms_room_rooms.room_id) * `lock_type` - 锁定类型 (maintenance/cleaning/management/malfunction) * `lock_start_time` - 锁定开始时间 * `lock_end_time` - 锁定结束时间 * `lock_reason` - 锁定原因 * `lock_status` - 锁定状态 (active/unlocked/expired) * `unlock_time` - 解锁时间 * `unlock_by` - 解锁操作人 * `unlock_reason` - 解锁原因 * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_room_lock_tenant` (tenant_id) * `idx_room_lock_dept` (dept_id) * `idx_room_lock_room` (room_id) * `idx_room_lock_status` (lock_status) * `idx_room_lock_time` (lock_start_time, lock_end_time) * 外键约束: * `fk_room_lock_room` FOREIGN KEY (room_id) REFERENCES pms_room_rooms(room_id) ### 3.4 价格管理表 (门店级隔离) #### 3.4.1 `pms_room_pricing_rules` - 价格规则表 * 业务描述: 存储动态定价规则。 * 数据隔离: 门店级隔离 (dept_id可空表示租户级通用规则,具体以业务为准,当前ER图定义是门店级) * 主键: `rule_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `rule_id` - 价格规则唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店,可空,关联 sys_dept.dept_id) * `name` - 规则名称 * `room_type_id` - 房型ID (可空, 关联 pms_room_types.room_type_id) * `date_range_start` - 适用开始日期 * `date_range_end` - 适用结束日期 * `days_of_week_json` - 适用星期 (JSON, e.g., [1,2,7]) * `min_length_of_stay` - 最小入住天数 * `max_length_of_stay` - 最大入住天数 * `price_adjustment_type` - 调整类型 * `adjustment_value` - 调整值 (DECIMAL(10,2)) * `priority` - 规则优先级 * `status` - 状态 (active/inactive) * `channel_restrictions_json` - 渠道限制 (JSON数组) * `guest_count_min` - 最小客人数 (INT) * `guest_count_max` - 最大客人数 (INT) * `advance_booking_days_min` - 最小提前预订天数 (INT) * `advance_booking_days_max` - 最大提前预订天数 (INT) * `rule_description` - 规则描述 (VARCHAR(500)) * `is_combinable` - 是否可与其他规则叠加 (BOOLEAN, DEFAULT TRUE) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_pms_rpr_tenant_dept_status_priority` (tenant_id, dept_id, status, priority) * `idx_pms_rpr_tenant_dept_rt_dates` (tenant_id, dept_id, room_type_id, date_range_start, date_range_end) * `idx_pms_rpr_tenant_dept_combinable` (tenant_id, dept_id, is_combinable, status) #### 3.4.2 `pms_pricing_calculations` - 价格计算历史表 * 业务描述: 记录每次价格计算的详细过程和结果,支持价格审计和趋势分析。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `calculation_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `calculation_id` - 计算记录唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店, 关联 sys_dept.dept_id) * `room_type_id` - 房型ID (关联 pms_room_types.room_type_id) * `check_in_date` - 入住日期 (DATE, 非空) * `check_out_date` - 离店日期 (DATE, 非空) * `base_price` - 基础价格 (DECIMAL(10,2), 非空) * `final_price` - 最终价格 (DECIMAL(10,2), 非空) * `applied_rules_json` - 应用的规则详情 (JSON) * `calculation_time` - 计算时间 (DATETIME, 非空) * `channel_id` - 渠道ID (BIGINT, 关联 pms_core_channels.channel_id) * `guest_count` - 客人数量 (INT) * `advance_booking_days` - 提前预订天数 (INT) * `calculation_context` - 计算上下文 (JSON, 如促销活动、会员等级等) * 索引设计: * `idx_pms_pc_tenant_dept_rt_dates` (tenant_id, dept_id, room_type_id, check_in_date, check_out_date) * `idx_pms_pc_calculation_time` (calculation_time) * `idx_pms_pc_tenant_dept_channel` (tenant_id, dept_id, channel_id) * 外键约束: * `fk_pricing_calc_room_type` FOREIGN KEY (room_type_id) REFERENCES pms_room_types(room_type_id) #### 3.4.3 `pms_special_date_pricing` - 特殊日期价格表 * 业务描述: 存储特殊日期(节假日、活动日等)的价格设置,具有高优先级。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `special_date_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `special_date_id` - 特殊日期唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店,可空表示租户级,关联 sys_dept.dept_id) * `name` - 特殊日期名称 (VARCHAR(100), 非空) * `date_type` - 日期类型 (VARCHAR(50), 如 holiday/festival/event/promotion) * `specific_date` - 具体日期 (DATE, 可空) * `date_range_start` - 日期范围开始 (DATE, 可空) * `date_range_end` - 日期范围结束 (DATE, 可空) * `room_type_id` - 房型ID (可空表示全部房型, 关联 pms_room_types.room_type_id) * `price_adjustment_type` - 调整类型 (VARCHAR(50), 非空) * `adjustment_value` - 调整值 (DECIMAL(10,2), 非空) * `fixed_price` - 固定价格 (DECIMAL(10,2), 可空) * `priority` - 优先级 (INT, DEFAULT 100) * `status` - 状态 (VARCHAR(50), DEFAULT 'active') * `description` - 描述 (VARCHAR(500)) * `is_recurring_yearly` - 是否每年重复 (TINYINT, DEFAULT 0) * `min_length_of_stay` - 最小入住天数 (INT, 可空) * `max_length_of_stay` - 最大入住天数 (INT, 可空) * `channel_restrictions_json` - 渠道限制 (JSON数组) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_pms_sdp_tenant_dept_date` (tenant_id, dept_id, specific_date) * `idx_pms_sdp_tenant_dept_rt` (tenant_id, dept_id, room_type_id) * `idx_pms_sdp_tenant_dept_type_status` (tenant_id, dept_id, date_type, status) * `idx_pms_sdp_date_range` (specific_date, status) * 外键约束: * `fk_special_date_room_type` FOREIGN KEY (room_type_id) REFERENCES pms_room_types(room_type_id) ### 3.5 订单管理表 (门店级隔离) #### 3.5.1 `pms_core_orders` - 核心订单表 * 业务描述: 存储客户预订的核心订单信息,包括预订详情、客户信息、房间分配、订单状态等。 * 数据隔离: **门店级隔离,包含 `dept_id` 字段** * 主键: `order_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `order_id` - 订单唯一ID * `tenant_id` - 租户ID (多租户拦截器自动过滤) * `dept_id` - 部门ID (门店) * `contact_id` - 联系人ID (关联 pms_customer_contacts.contact_id) * `pms_room_id` - 分配的房间ID (关联 pms_room_rooms.room_id) * `room_type_id` - 预订的房型ID (关联 pms_room_types.room_type_id) * `channel_id` - 订单来源渠道ID (关联 pms_core_channels.channel_id) * `check_in_date` - 计划入住日期 * `check_out_date` - 计划离店日期 * `num_adults` - 成人数 * `num_children` - 儿童数 * `total_amount` - 订单总金额 (DECIMAL(10,2)) * `paid_amount` - 已付金额 (DECIMAL(10,2)) * `order_status` - 订单状态 * `order_source` - 订单来源 * `notes` - 订单备注 * `actual_check_in_time` - 实际入住时间 * `actual_check_out_time` - 实际退房时间 * `confirmed_time` - 订单确认时间 * `cancelled_time` - 订单取消时间 * `expected_arrival_time` - 预计到达时间 * `special_requests` - 特殊要求 * `create_dept` - 创建部门 (BIGINT) * `create_by` - 创建者 (BIGINT) * `create_time` - 创建时间 (DATETIME) * `update_by` - 更新者 (BIGINT) * `update_time` - 更新时间 (DATETIME) * `del_flag` - 删除标志 (CHAR(1) DEFAULT '0' NOT NULL) * 索引设计: * `idx_pms_o_tenant_dept` (tenant_id, dept_id) * `idx_pms_o_tenant_dept_status` (tenant_id, dept_id, order_status) * `idx_pms_o_tenant_dept_dates` (tenant_id, dept_id, check_in_date, check_out_date) * `idx_pms_o_tenant_dept_contact` (tenant_id, dept_id, contact_id) * `idx_pms_o_tenant_dept_room_dates` (tenant_id, dept_id, pms_room_id, check_in_date, check_out_date) #### 3.5.2 `pms_order_guests` - 订单入住客人表 * 业务描述: 记录订单的实际入住客人信息,支持多人入住登记,与客户档案灵活关联。 * 数据隔离: **门店级隔离,包含 `dept_id` 字段** * 主键: `guest_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `guest_id` - 客人记录唯一ID * `tenant_id` - 租户ID (多租户拦截器自动过滤) * `order_id` - 订单ID (关联 pms_core_orders.order_id) * `dept_id` - 部门ID (门店) * `contact_id` - 关联客户联系人ID (关联 pms_customer_contacts.contact_id,可空) * `guest_type` - 客人类型 (primary/additional) * `is_primary_contact` - 是否为订单主联系人 (TINYINT(1) DEFAULT '0') * `full_name` - 客人姓名 * `id_type` - 证件类型 * `id_number_encrypted` - 证件号码(加密) * `phone_number` - 联系电话 * `age_group` - 年龄组 (adult/child/infant) * `create_time` - 创建时间 (DATETIME) * `create_by` - 创建者 (BIGINT) * `del_flag` - 删除标志 (CHAR(1) DEFAULT '0' NOT NULL) * 业务规则: * 每个订单必须有且仅有一个 `guest_type='primary'` 的主客人 * 主客人的 `contact_id` 应与订单的 `contact_id` 保持一致 * 同行客人可选择关联现有客户档案或不关联 * 客人信息变更时可选择同步更新客户档案 * 索引设计: * `idx_pms_og_tenant_order` (tenant_id, order_id) * `idx_pms_og_tenant_dept` (tenant_id, dept_id) * `idx_pms_og_order_guest_type` (order_id, guest_type) * `idx_pms_og_tenant_contact` (tenant_id, contact_id) * `idx_pms_og_order_primary` (order_id, is_primary_contact) #### 3.5.3 `pms_order_status_history` - 订单状态变更历史表 * 业务描述: 记录订单状态的每次变更历史,支持操作审计和状态追踪。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `history_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `history_id` - 历史记录唯一ID * `tenant_id` - 租户ID * `order_id` - 订单ID (关联 pms_core_orders.order_id) * `dept_id` - 部门ID (门店, 关联 sys_dept.dept_id) * `from_status` - 原状态 (VARCHAR(50), 可空) * `to_status` - 新状态 (VARCHAR(50), 非空) * `change_reason` - 状态变更原因 (VARCHAR(500)) * `change_time` - 变更时间 (DATETIME, 非空) * `change_by` - 操作人 (BIGINT, 关联 sys_user.user_id) * `notes` - 备注 (TEXT) * `del_flag` - 删除标志 (CHAR(1) DEFAULT '0' NOT NULL) * 索引设计: * `idx_pms_osh_tenant_order` (tenant_id, order_id) * `idx_pms_osh_tenant_dept_time` (tenant_id, dept_id, change_time) * `idx_pms_osh_order_time` (order_id, change_time) * 外键约束: * `fk_order_status_history_order` FOREIGN KEY (order_id) REFERENCES pms_core_orders(order_id) #### 3.5.4 `pms_core_order_items` - 订单项目表 * 业务描述: 存储订单中的具体项目,如房费、附加服务等。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `order_item_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `order_item_id` - 订单项唯一ID * `tenant_id` - 租户ID * `order_id` - 所属订单ID (关联 pms_core_orders.order_id) * `dept_id` - 部门ID (门店, 关联 sys_dept.dept_id) * `pms_room_id` - 关联房间ID (可空, 如房晚项目, 关联 pms_room_rooms.room_id) * `product_id` - 产品ID (可空, 如关联 pms_finance_extra_charge_items.item_id) * `product_type` - 产品类型 (room_fee/extra_service/package_item) * `description` - 项目描述 * `quantity` - 数量 * `unit_price` - 单价 (DECIMAL(10,2)) * `service_date` - 服务日期 (针对非房晚类项目) * `notes` - 项目备注 * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_pms_oi_tenant_order` (tenant_id, order_id) * `idx_pms_oi_tenant_dept_product` (tenant_id, dept_id, product_type, product_id) #### 3.5.5 `pms_core_channels` - 订单渠道表 * 业务描述: 存储订单来源渠道信息。 * 数据隔离: 门店级隔离 (dept_id可空表示租户级通用渠道) * 主键: `channel_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `channel_id` - 渠道唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店,可空,关联 sys_dept.dept_id) * `name` - 渠道名称 * `channel_type` - 渠道类型 * `description` - 渠道描述 * `status` - 状态 (active/inactive) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_pms_ch_tenant_dept_status` (tenant_id, dept_id, status) * `idx_pms_ch_tenant_dept_type` (tenant_id, dept_id, channel_type) #### 3.5.6 `pms_room_inventory_snapshot` - 房型库存快照表 * 业务描述: 存储房型库存的快照数据,用于快速查询可用性和性能优化。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `snapshot_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `snapshot_id` - 快照唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店, 关联 sys_dept.dept_id) * `room_type_id` - 房型ID (关联 pms_room_types.room_type_id) * `snapshot_date` - 快照日期 (DATE, 非空) * `total_rooms` - 总房间数 (INT, 非空) * `available_rooms` - 可用房间数 (INT, 非空) * `occupied_rooms` - 已占用房间数 (INT, 非空) * `maintenance_rooms` - 维护中房间数 (INT, 非空) * `locked_rooms` - 锁定房间数 (INT, 非空) * `last_updated` - 最后更新时间 (DATETIME, 非空) * 索引设计: * `unq_pms_ris_tenant_dept_rt_date` (tenant_id, dept_id, room_type_id, snapshot_date) -- 唯一约束 * `idx_pms_ris_tenant_dept_date` (tenant_id, dept_id, snapshot_date) * `idx_pms_ris_last_updated` (last_updated) * 外键约束: * `fk_room_inventory_room_type` FOREIGN KEY (room_type_id) REFERENCES pms_room_types(room_type_id) ### 3.6 财务管理表 (门店级隔离) #### 3.6.1 `pms_finance_folios` - 客户账单表 * 业务描述: 存储客户在店期间的所有费用和支付记录。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `folio_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `folio_id` - 账单唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店, 关联 sys_dept.dept_id) * `order_id` - 关联订单ID (UNIQUE, 关联 pms_core_orders.order_id) * `total_charges` - 总应收费用 (DECIMAL(10,2)) * `total_payments` - 总已收付款 (DECIMAL(10,2)) * `total_refunds` - 总已退款 (DECIMAL(10,2)) * `balance` AS (`total_charges` - `total_payments` + `total_refunds`) COMMENT '计算列:余额' * `folio_status` - 账单状态 * `notes` - 账单备注 * `closed_at` - 账单关闭时间 * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_pms_ff_tenant_dept_order` (tenant_id, dept_id, order_id) * `idx_pms_ff_tenant_dept_status` (tenant_id, dept_id, folio_status) #### 3.6.2 `pms_finance_transactions` - 财务交易流水表 * 业务描述: 记录每一笔财务交易明细。 * 数据隔离: 门店级隔离,使用多租户拦截器 * 主键: `transaction_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `transaction_id` - 交易唯一ID * `tenant_id` - 租户ID * `folio_id` - 所属账单ID (关联 pms_finance_folios.folio_id) * `dept_id` - 部门ID (门店, 关联 sys_dept.dept_id) * `transaction_type` - 交易类型 * `amount` - 交易金额 (DECIMAL(10,2)) * `description` - 交易描述 * `payment_method_id` - 支付方式ID (关联 pms_finance_payment_methods.payment_method_id) * `payment_gateway_txn_id` - 支付网关交易号 * `transaction_time` - 交易时间 * `related_order_item_id` - 关联订单项ID (可空, 关联 pms_core_order_items.order_item_id) * `notes` - 交易备注 * `is_void` - 是否已作废 (BOOLEAN) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_pms_ft_tenant_folio` (tenant_id, folio_id) * `idx_pms_ft_tenant_dept_type_time` (tenant_id, dept_id, transaction_type, transaction_time) #### 3.6.3 `pms_finance_payment_methods` - 支付方式表 * 业务描述: 存储系统支持的支付方式。 * 数据隔离: 门店级隔离 (dept_id可空表示租户级通用支付方式) * 主键: `payment_method_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `payment_method_id` - 支付方式唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店,可空,关联 sys_dept.dept_id) * `name` - 支付方式名称 * `method_type` - 支付方式类型 * `details_json` - 附加配置 (JSON, 如银行账号,终端号等) * `status` - 状态 (active/inactive) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_pms_fpm_tenant_dept_status` (tenant_id, dept_id, status) * `idx_pms_fpm_tenant_dept_type` (tenant_id, dept_id, method_type) #### 3.6.4 `pms_finance_extra_charge_items` - 附加费用项目表 * 业务描述: 存储可供订单选择的附加费用项目。 * 数据隔离: 门店级隔离 (dept_id可空表示租户级通用项目) * 主键: `item_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `item_id` - 附加费用项唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店,可空,关联 sys_dept.dept_id) * `name` - 项目名称 * `default_price` - 默认单价 (DECIMAL(10,2)) * `category` - 费用类别 * `is_taxable` - 是否应税 (BOOLEAN) * `description` - 项目描述 * `status` - 状态 (active/inactive) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `idx_pms_feci_tenant_dept_status` (tenant_id, dept_id, status) * `idx_pms_feci_tenant_dept_category` (tenant_id, dept_id, category) ### 3.7 合作方管理表 (全局共享/租户级) #### 3.7.1 `pms_suppliers` - 供应商表 * 业务描述: 存储供应商信息,如清洁、维护、物料等供应商。 * 数据隔离: **支持全局共享 (tenant_id IS NULL) 和租户级隔离 (tenant_id IS NOT NULL)**。已从多租户拦截器排除,业务层处理。 * 主键: `supplier_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `supplier_id` - 供应商唯一ID * `tenant_id` - 租户ID (可空,NULL表示全局供应商) * `supplier_type` - 供应商类型 * `company_name` - 公司名称 * `contact_person` - 联系人姓名 * `phone_number` - 联系电话 * `email` - 邮箱地址 * `business_scope` - 业务范围描述 * `service_area` - 服务区域 * `contract_info` - 合同信息 * `status` - 供应商状态 (active/inactive) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 (对于全局数据,create_dept可能为NULL) * 索引设计: * `idx_pms_s_tenant_type` (tenant_id, supplier_type) * `idx_pms_s_tenant_name` (tenant_id, company_name) * `idx_pms_s_tenant_status` (tenant_id, status) #### 3.7.2 `pms_partners` - 合作伙伴表 * 业务描述: 存储合作伙伴信息,如旅行社、代理商等,支持佣金设置。 * 数据隔离: **支持全局共享 (tenant_id IS NULL) 和租户级隔离 (tenant_id IS NOT NULL)**。已从多租户拦截器排除,业务层处理。 * 主键: `partner_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `partner_id` - 合作伙伴唯一ID * `tenant_id` - 租户ID (可空,NULL表示全局合作伙伴) * `partner_type` - 合作伙伴类型 * `company_name` - 公司名称 * `contact_person` - 联系人姓名 * `phone_number` - 联系电话 * `email` - 邮箱地址 * `website_url` - 网站地址 * `commission_rate` - 佣金比例 (DECIMAL(5,2), 如 5.50 表示5.5%) * `payment_terms` - 付款条件 * `cooperation_level` - 合作等级 * `contract_start_date` - 合同开始日期 * `contract_end_date` - 合同结束日期 * `status` - 合作伙伴状态 (active/inactive) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 (对于全局数据,create_dept可能为NULL) * 索引设计: * `idx_pms_p_tenant_type` (tenant_id, partner_type) * `idx_pms_p_tenant_name` (tenant_id, company_name) * `idx_pms_p_tenant_status` (tenant_id, status) ### 3.8 系统配置表 (租户级/门店级) #### 3.8.1 `pms_tenant_settings` - 租户/门店配置表 * 业务描述: 存储租户级或门店级的各项配置参数。 * 数据隔离: **通过dept_id区分。dept_id为NULL表示租户级配置,非NULL表示特定门店的配置。** 标准多租户拦截器处理tenant_id。 * 主键: `setting_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `setting_id` - 设置唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店,NULL=租户级,关联 sys_dept.dept_id) * `setting_group` - 设置分组 (e.g., booking_rules, finance_params) * `setting_key` - 设置键名 (e.g., max_advance_booking_days) * `setting_value` - 设置值 (TEXT) * `value_type` - 值类型 (string/integer/boolean/json) * `description` - 设置描述 * `is_sensitive` - 是否敏感设置 (BOOLEAN) * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `unq_pms_ts_tenant_dept_group_key` (tenant_id, dept_id, setting_group, setting_key, del_flag) * `idx_pms_ts_tenant_dept_group` (tenant_id, dept_id, setting_group) #### 3.8.2 `pms_mp_settings` - 小程序配置表 * 业务描述: 存储小程序相关的配置。 * 数据隔离: **通过dept_id区分。dept_id为NULL表示租户级通用小程序配置,非NULL表示特定门店的小程序配置。** 标准多租户拦截器处理tenant_id。 * 主键: `setting_id` (BIGINT AUTO_INCREMENT) * 核心字段: * `setting_id` - 小程序设置唯一ID * `tenant_id` - 租户ID * `dept_id` - 部门ID (门店,NULL=租户级,关联 sys_dept.dept_id) * `setting_key` - 设置键名 (e.g., theme_color, app_id) * `setting_value` - 设置值 (TEXT) * `value_type` - 值类型 (string/integer/boolean/json) * `description` - 设置描述 * `create_dept`, `create_by`, `create_time`, `update_by`, `update_time`, `del_flag` -- 标准审计字段 * 索引设计: * `unq_pms_mps_tenant_dept_key` (tenant_id, dept_id, setting_key, del_flag) #### 3.8.3 `pms_tenant_user_devices` - 用户设备表 * 业务描述: 存储用户登录过的设备信息,用于消息推送等。 * 数据隔离: **租户用户级别,通过user_id关联,间接关联到租户。** 标准多租户拦截器处理tenant_id。 * 主键: `id` (BIGINT AUTO_INCREMENT) * 核心字段: * `id` - 设备记录唯一ID * `tenant_id` - 租户ID (冗余,通过user_id可查,但便于直接过滤) * `user_id` - 用户ID (关联 sys_user.user_id) * `device_type` - 设备类型 (iOS/Android/Web/MiniProgram) * `device_token` - 设备令牌 (用于推送) * `app_version` - 应用版本 * `last_login_at` - 最后登录时间 * `status` - 状态 (active/inactive/expired) * `create_time` - 创建时间 (DATETIME) * `update_time` - 更新时间 (DATETIME) * (*注: 此表通常不包含create_by, update_by, del_flag, create_dept,因为是用户设备自动注册行为*) * 索引设计: * `idx_pms_tud_tenant_user_device` (tenant_id, user_id, device_type) * `idx_pms_tud_tenant_user_status` (tenant_id, user_id, status) * `idx_pms_tud_device_token` (device_token) ## 4. 主要业务实体状态流转 ### 4.1 订单状态流转 ```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 ``` **订单状态枚举值:** - `pending_confirmation` (待确认) - `confirmed` (已确认) - `checked_in` (已入住) - `checked_out` (已退房) - `cancelled` (已取消) - `no_show` (未到店) - `extended` (已延期) - `waitlist` (等候名单) ### 4.2 房间状态流转 **物理状态流转:** ```mermaid stateDiagram-v2 [*] --> available: 房间空闲可用 available --> occupied: 客人入住 available --> maintenance: 安排维护 available --> out_of_service: 暂停服务 occupied --> available: 客人退房且已清洁 maintenance --> available: 维护完成 out_of_service --> available: 恢复服务 ``` **清洁状态流转:** ```mermaid stateDiagram-v2 [*] --> clean: 初始状态 clean --> dirty: 客人使用后 dirty --> cleaning_in_progress: 开始清洁 cleaning_in_progress --> inspected: 清洁完成待查房 inspected --> clean: 查房通过 inspected --> cleaning_in_progress: 查房未通过 ``` ### 4.3 账单状态流转 ```mermaid stateDiagram-v2 [*] --> open: 订单创建时生成 open --> closed: 账务结清 open --> void: 作废账单 open --> pending_settlement: 等待结算 pending_settlement --> closed: 结算完成 pending_settlement --> open: 取消结算 closed --> open: 重新打开 (特殊情况) void --> [*] : 账单作废 closed --> [*] : 账单关闭 ``` ## 5. 核心业务枚举值定义 ### 5.1 客户联系人相关枚举 ```sql -- pms_customer_contacts.contact_type 'individual_guest' -- 散客 'group_leader' -- 团队负责人 'corporate_contact' -- 企业联系人 'vip_member' -- VIP会员 'repeat_guest' -- 回头客 'marketing_tag' -- 营销标签 'behavior_tag' -- 行为标签 'other' -- 其他 -- pms_customer_contacts.contact_status 'active' -- 活跃 'inactive' -- 不活跃 'blacklisted' -- 黑名单 'pending_verification' -- 待验证 'merged_duplicate' -- 已合并重复档案 -- pms_customer_contacts.gender 'male' -- 男 'female' -- 女 'non_binary' -- 非二元性别 'prefer_not_to_say' -- 不愿透露 'unknown' -- 未知 -- pms_customer_contacts.member_level 'bronze' -- 铜牌会员 'silver' -- 银牌会员 'gold' -- 金牌会员 'platinum' -- 白金会员 'diamond' -- 钻石会员 -- pms_contact_tags.category 'contact_level' -- 联系人等级 'contact_source' -- 联系人来源 'contact_preference' -- 偏好标签 'service_record' -- 服务记录 'marketing_tag' -- 营销标签 'behavior_tag' -- 行为标签 ``` ### 5.2 供应商相关枚举 ```sql -- pms_suppliers.supplier_type 'cleaning_service' -- 清洁服务 'maintenance_repair' -- 维护维修 'laundry_service' -- 洗涤服务 'food_beverage' -- 餐饮供应 'amenities_supplies' -- 用品供应 'technology_service' -- 技术服务 'other' -- 其他 -- pms_suppliers.status 'active' -- 活跃 'inactive' -- 不活跃 ``` ### 5.3 合作伙伴相关枚举 ```sql -- pms_partners.partner_type 'travel_agency' -- 旅行社 'ota_platform' -- OTA平台 'corporate_client' -- 企业客户 'booking_agent' -- 预订代理 'tour_operator' -- 旅游运营商 'other' -- 其他 -- pms_partners.cooperation_level 'standard' -- 标准 'preferred' -- 优选 'strategic' -- 战略 'exclusive' -- 独家 -- pms_partners.status 'active' -- 活跃 'inactive' -- 不活跃 ``` ### 5.4 房间相关枚举 ```sql -- pms_room_rooms.room_status (物理状态) 'available' -- 可用 'occupied' -- 占用中 'maintenance' -- 维护中 'out_of_service' -- 暂停服务 -- pms_room_rooms.cleaning_status (清洁状态) 'clean' -- 已清洁 'dirty' -- 待清洁 'cleaning_in_progress' -- 清洁中 'inspected' -- 已查房 -- pms_room_locks.lock_type (锁定类型) 'maintenance' -- 维护锁定 'cleaning' -- 清洁锁定 'management' -- 管理锁定 'malfunction' -- 故障锁定 -- pms_room_locks.lock_status (锁定状态) 'active' -- 锁定中 'unlocked' -- 已解锁 'expired' -- 已过期 ``` ### 5.5 价格相关枚举 ```sql -- 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' -- 设置为特定值 ``` ### 5.6 订单相关枚举 ```sql -- pms_core_orders.order_status (订单状态) 'pending_confirmation' -- 待确认 'confirmed' -- 已确认 'checked_in' -- 已入住 'checked_out' -- 已退房 'cancelled' -- 已取消 'no_show' -- 未到店 'extended' -- 已延期 'waitlist' -- 等候名单 -- 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_channels.channel_type 'ota' -- OTA平台 'direct_booking' -- 直接预订 'gds' -- 全球分销系统 'wholesaler' -- 批发商 'corporate' -- 企业协议 'internal_use' -- 内部使用 -- pms_order_guests.guest_type (客人类型) 'primary' -- 主客人 'additional' -- 同行客人 'child' -- 儿童 'infant' -- 婴儿 'senior' -- 老人 -- pms_order_guests.age_group (年龄组) 'adult' -- 成人 'child' -- 儿童 'infant' -- 婴儿 'senior' -- 老人 -- pms_order_guests.id_type (证件类型) 'ID_CARD' -- 身份证 'PASSPORT' -- 护照 'DRIVER_LICENSE' -- 驾驶证 'MILITARY_ID' -- 军官证 'STUDENT_ID' -- 学生证 'OTHER' -- 其他 -- pms_order_status_history.change_reason (状态变更原因) 'guest_request' -- 客人要求 'system_auto' -- 系统自动 'staff_operation' -- 员工操作 'payment_received' -- 收到付款 'payment_failed' -- 付款失败 'room_ready' -- 房间准备就绪 'guest_arrived' -- 客人到达 'guest_departed' -- 客人离店 'cancellation_policy' -- 取消政策 'no_show_timeout' -- 未到店超时 'maintenance_required' -- 需要维护 'other' -- 其他原因 ``` ### 5.7 财务相关枚举 ```sql -- 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_unionpay' -- 银联卡 'alipay' -- 支付宝 'wechat_pay' -- 微信支付 'bank_transfer' -- 银行转账 'company_account' -- 公司账户/挂账 'voucher' -- 代金券 'points_redemption' -- 积分兑换 'other' -- 其他 -- pms_finance_extra_charge_items.category (附加费用项目类别) 'room_charge' -- 房费相关 'food_beverage' -- 餐饮 'laundry' -- 洗衣 'parking' -- 停车 'damages' -- 损坏赔偿 'other_service' -- 其他服务 'retail' -- 商品销售 'telephone' -- 电话费 'business_center' -- 商务中心 'spa_services' -- SPA服务 -- pms_special_date_pricing.date_type (特殊日期类型) 'holiday' -- 法定节假日 'festival' -- 传统节日 'event' -- 特殊活动 'promotion' -- 促销活动 'conference' -- 会议会展 'sports' -- 体育赛事 'local_event' -- 本地活动 -- pms_special_date_pricing.price_adjustment_type 'fixed_amount_override' -- 固定价格覆盖 'percentage_increase_from_base' -- 基价百分比上浮 'percentage_discount_from_base' -- 基价百分比折扣 'fixed_amount_increase_on_base' -- 基价固定金额上浮 'fixed_amount_decrease_from_base' -- 基价固定金额下调 -- pms_pricing_calculations.calculation_context (计算上下文) -- JSON格式示例: { "promotion_code": "SUMMER2024", -- 促销代码 "member_level": "gold", -- 会员等级 "booking_channel": "direct", -- 预订渠道 "advance_days": 30, -- 提前预订天数 "guest_count": 2, -- 客人数量 "special_events": ["local_festival"], -- 特殊事件 "weather_factor": "good", -- 天气因素 "occupancy_rate": 0.85 -- 入住率 } ``` ## 6. 数据权限控制与索引设计 ### 6.1 索引命名与设计规范 #### 6.1.1 索引命名约定 为确保索引名称的规范性和可读性,建议遵循以下命名约定: * **唯一索引 (Unique Index):** * 格式: `unq_[子系统前缀]_[表名简写]_[字段1缩写]_[字段2缩写]...` * 示例: `unq_pms_r_tdrn` 代表 `pms_room_rooms` 表上 `tenant_id`, `dept_id`, `room_number` 的唯一索引。 * 说明: 表名简写和字段缩写应尽量简洁并能表达其含义。 * **普通索引 (Non-Unique Index):** * 格式: `idx_[子系统前缀]_[表名简写]_[字段1缩写]_[字段2缩写]...` * 示例: `idx_pms_o_tds` 代表 `pms_core_orders` 表上 `tenant_id`, `dept_id`, `order_status` 的普通索引。 * **表名简写建议**:在项目内部可约定一套表名简写规则,例如 `pms_customer_contacts` -> `cc` or `cust`, `pms_room_rooms` -> `rr` or `room`。 * **现有索引兼容性**: 本文档中现有的索引名称(如 `idx_pms_o_tenant_dept_status`)已具备良好的可读性并遵循了前缀和字段组合的原则。新开发的索引可考虑采用上述更简洁的缩写约定,现有索引可逐步过渡或在可读性要求较高时保留描述性更强的名称。 #### 6.1.2 索引设计原则 * **租户和部门优先**: 对于所有包含 `tenant_id` 和 `dept_id` 的PMS业务表,查询相关的索引应优先考虑这两个字段,顺序通常为 `(tenant_id, dept_id, ...其他条件字段)`,以充分利用多租户和门店级数据隔离的特性。 * **覆盖索引 (Covering Index)**: 尽量设计覆盖索引以减少回表查询(即索引包含查询所需的所有列),从而提高查询性能。 * **选择性高的列优先**: 索引列的选择应优先考虑那些具有高区分度的列(即列中唯一值较多)。 * **避免过多索引**: 每个表的索引数量不宜过多(通常建议不超过5-7个),过多的索引会增加写操作(INSERT, UPDATE, DELETE)的开销,并占用额外的存储空间。 * **避免在索引列上使用函数或表达式**: 这可能导致索引失效。 * **定期审查和优化**: 应定期监控索引的使用情况(如未使用索引、低效索引),并进行相应的调整和优化。 ### 6.2 数据隔离策略 #### 6.2.1 多租户拦截器配置 ```yaml # application.yml tenant: enable: true excludes: # 若依系统表 - sys_menu - sys_tenant - sys_tenant_package - sys_role_dept - sys_role_menu - sys_user_post - sys_user_role - sys_client - sys_oss_config # PMS供应商合作伙伴表 (支持全局共享,排除多租户拦截器) - pms_suppliers # 供应商信息 - pms_partners # 合作伙伴信息 ``` **重要说明**: - **`pms_customer_contacts`** 表**不在排除列表中**,因为该表有 `tenant_id` 字段且需要租户间隔离 - **`pms_contact_tags`** 和 **`pms_contact_tag_relations`** 表**不在排除列表中**,使用标准多租户拦截器 - **`pms_suppliers`** 和 **`pms_partners`** 表在排除列表中,因为它们支持全局共享 (`tenant_id` 可为 NULL) #### 6.2.2 数据权限控制层级 **Level 1: 多租户拦截器 (自动)** - 适用表:所有含 `tenant_id` 且不在排除列表的表 - 自动添加:`WHERE tenant_id = #{currentTenantId}` - 确保:租户间数据完全隔离 **Level 2: 门店级权限控制 (业务层)** - 适用表:门店级PMS业务表 (含 `dept_id` 字段) - 业务层添加:`AND dept_id = #{currentDeptId}` - 确保:同租户不同门店数据隔离 **Level 3: 租户级共享 (标准拦截器)** - 适用表:客户信息、客户标签 - 拦截器自动添加:`WHERE tenant_id = #{currentTenantId}` - 确保:租户内所有门店可见,租户间隔离 **Level 4: 全局共享 (排除拦截器)** - 适用表:供应商、合作伙伴 (`tenant_id` 可为 NULL) - 业务层手动添加:`WHERE tenant_id IS NULL OR tenant_id = #{currentTenantId}` - 确保:全局数据和租户数据都可见 ### 6.3 核心索引设计 #### 6.3.1 租户级共享表索引 (使用多租户拦截器) ```sql -- 客户联系人查询索引 CREATE INDEX idx_pms_cc_tenant_name ON pms_customer_contacts (tenant_id, full_name); CREATE INDEX idx_pms_cc_tenant_phone ON pms_customer_contacts (tenant_id, phone_number); CREATE INDEX idx_pms_cc_tenant_status_type ON pms_customer_contacts (tenant_id, contact_status, contact_type); -- 联系人标签查询索引 CREATE INDEX idx_pms_ct_tenant_dept ON pms_contact_tags (tenant_id, dept_id); CREATE INDEX idx_pms_ct_tenant_dept_name_category ON pms_contact_tags (tenant_id, dept_id, name, category); -- 标签关联查询索引 CREATE INDEX idx_pms_ctr_tenant_contact ON pms_contact_tag_relations (tenant_id, contact_id); CREATE INDEX idx_pms_ctr_tenant_tag ON pms_contact_tag_relations (tenant_id, tag_id); ``` #### 6.3.2 门店级业务表索引 (使用多租户拦截器) ```sql -- 核心查询复合索引 (tenant_id + dept_id + 业务字段) CREATE INDEX idx_pms_o_tenant_dept_status ON pms_core_orders (tenant_id, dept_id, order_status); CREATE INDEX idx_pms_o_tenant_dept_dates ON pms_core_orders (tenant_id, dept_id, check_in_date, check_out_date); CREATE INDEX idx_pms_r_tenant_dept_status ON pms_room_rooms (tenant_id, dept_id, room_status, cleaning_status); -- 关联查询索引 CREATE INDEX idx_pms_o_tenant_dept_contact ON pms_core_orders (tenant_id, dept_id, contact_id); ``` #### 6.3.3 全局共享表索引 (排除多租户拦截器) ```sql -- 供应商查询索引 (支持 tenant_id 为 NULL) CREATE INDEX idx_pms_s_tenant_type ON pms_suppliers (tenant_id, supplier_type); CREATE INDEX idx_pms_s_tenant_name ON pms_suppliers (tenant_id, company_name); -- 合作伙伴查询索引 (支持 tenant_id 为 NULL) CREATE INDEX idx_pms_p_tenant_type ON pms_partners (tenant_id, partner_type); CREATE INDEX idx_pms_p_tenant_name ON pms_partners (tenant_id, company_name); ``` ### 6.4 典型查询模式 #### 6.4.1 租户级共享查询 (多租户拦截器自动处理) ```sql -- 客户联系人查询 (拦截器自动添加 tenant_id 条件) SELECT * FROM pms_customer_contacts WHERE tenant_id = '100000' -- 拦截器自动添加 AND contact_status = 'active' AND full_name LIKE '%张%' ORDER BY create_time DESC; -- 联系人标签查询 (支持门店级和租户级标签) SELECT * FROM pms_contact_tags WHERE tenant_id = '100000' -- 拦截器自动添加 AND (dept_id = 103 OR dept_id IS NULL) -- 业务层添加 AND category = 'contact_level' ORDER BY sort_order; ``` #### 6.4.2 门店级查询 (多租户拦截器 + 业务层门店过滤) ```sql -- 门店订单查询 SELECT * FROM pms_core_orders WHERE tenant_id = '100000' -- 拦截器自动添加 AND dept_id = 103 -- 业务层添加 AND order_status = 'confirmed' ORDER BY check_in_date DESC; ``` #### 6.4.3 全局共享查询 (业务层手动处理) ```sql -- 供应商查询 (包含全局和租户级供应商) SELECT * FROM pms_suppliers WHERE (tenant_id IS NULL OR tenant_id = '100000') -- 业务层手动添加 AND supplier_type = 'cleaning_service' AND status = 'active' ORDER BY company_name; ``` ### 6.5 实施建议 #### 6.5.1 开发规范 1. **客户联系人查询**: 直接查询,让多租户拦截器自动处理租户隔离 2. **联系人标签查询**: 业务层添加 `(dept_id = #{currentDeptId} OR dept_id IS NULL)` 实现门店和租户级标签 3. **订单等门店数据**: 多租户拦截器 + 业务层 `dept_id` 过滤 4. **供应商合作伙伴**: 业务层手动添加 `(tenant_id IS NULL OR tenant_id = #{currentTenantId})` #### 6.5.2 性能优化 1. **复合索引优先**: 按 `(tenant_id, dept_id, 业务字段)` 顺序设计 2. **标签查询优化**: `pms_contact_tags` 的 `(tenant_id, dept_id)` 复合索引支持门店和租户级查询 3. **关联查询优化**: 客户联系人与订单关联时,优先使用 `tenant_id` 过滤 --- ## 版本历史 - v5.1 (上一版本) - 修正多租户拦截器配置,恢复遗漏的标签表,优化表名一致性 - v5.2 (上一版本) - 表名标准化优化,使用民宿行业标准术语,完善客户管理数据模型 - v5.3 (上一版本) - 全面同步需求文档v4.0:补充核心表审计字段、del_flag;统一ER图与表定义;对齐所有枚举值;明确供应商/合作伙伴的全局共享处理方式。 - v5.4 (上一版本) - 更新"命名与设计约定";重组第3节表结构定义,使其按业务模块划分,与需求文档结构对齐;确保所有表定义包含完整核心字段、审计字段和外键注释。 - v5.5 (当前版本) - 订单管理和价格管理数据模型优化:新增订单状态历史追踪、订单客人信息管理、价格计算历史记录、特殊日期价格管理、库存快照等功能支持。 **重要变更说明 (v5.5):** - **订单管理增强**: 新增 `pms_order_status_history` 表支持订单状态变更历史追踪;新增 `pms_order_guests` 表支持多人入住客人信息管理;优化 `pms_core_orders` 表增加关键时间字段和特殊要求字段。 - **价格管理完善**: 新增 `pms_pricing_calculations` 表记录价格计算历史和审计轨迹;新增 `pms_special_date_pricing` 表支持节假日和特殊活动的价格管理;优化 `pms_room_pricing_rules` 表增加渠道限制、客人数量、提前预订等高级规则字段。 - **库存管理支持**: 新增 `pms_room_inventory_snapshot` 表提供房型库存快照功能,提升查询性能和支持库存分析。 - **枚举值补充**: 新增订单客人类型、年龄组、特殊日期类型等枚举值定义。 - **索引优化**: 为新增表设计了完整的索引策略,优化查询性能和支持业务场景。 - **ER图更新**: 更新实体关系图,反映新增表和关联关系。 ### v5.6 (当前版本) - 客人信息管理优化 **发布日期**: 2024年12月 **主要变更**: 1. **订单客人表优化** (`pms_order_guests`): - 新增 `contact_id` 字段,支持与客户档案关联 - 新增 `is_primary_contact` 字段,标识订单主联系人 - 完善索引设计,提升查询性能 2. **订单表结构优化** (`pms_core_orders`): - 移除冗余字段 `primary_contact_name` 和 `primary_contact_phone` - 通过关联查询获取联系人信息,避免数据不一致 3. **价格规则表增强** (`pms_room_pricing_rules`): - 新增 `advance_booking_days_max` 字段 - 新增 `member_level_restrictions_json` 字段,支持会员等级限制 - 重命名 `rule_description` 为 `description`,保持命名一致性 4. **库存快照表完善** (`pms_room_inventory_snapshot`): - 新增 `dirty_rooms` 字段,统计脏房数量 - 新增 `out_of_order_rooms` 字段,统计停用房间数 - 新增 `reserved_rooms` 字段,统计预留房间数 5. **枚举值补充**: - 完善客人证件类型枚举 - 新增订单状态变更原因枚举 - 补充特殊日期类型枚举 - 增加价格计算上下文示例 6. **外键约束完善**: - 新增 `pms_order_guests` 与 `pms_customer_contacts` 的外键关联 - 新增 `pms_order_guests` 与 `pms_core_orders` 的外键关联 - 优化索引设计,支持高效的关联查询 7. **业务流程优化**: - 完善入住登记流程,支持智能档案匹配和新档案创建 - 优化客户档案维护流程,实现信息同步和统计更新 - 增强订单与客人信息的关联管理 ### v5.7 (当前版本) - 系统配置管理模块完善 **发布日期**: 2024年12月 **主要变更**: 1. **系统配置管理表新增**: - 新增 `pms_tenant_settings` 表,支持租户级和门店级配置管理 - 新增 `pms_mp_settings` 表,支持小程序配置管理 - 新增 `pms_tenant_user_devices` 表,支持用户设备管理和安全审计 2. **配置管理功能增强**: - 支持配置分组管理(预订规则、财务参数、界面外观、业务流程) - 支持配置继承机制(租户级配置、门店级覆盖) - 支持敏感配置加密存储和访问控制 - 支持配置项类型验证(string/integer/boolean/json/decimal) 3. **小程序配置支持**: - 主题配置(颜色、图标、名称) - 功能开关(在线预订、支付、客房服务、反馈) - 支付配置(微信支付、支付宝、超时设置) - 通知配置(预订通知、入住提醒、退房提醒) 4. **用户设备管理**: - 多设备类型支持(iOS/Android/Web/MiniProgram) - 设备状态跟踪(活跃、不活跃、过期、阻止) - 推送令牌管理和推送开关控制 - 登录历史和安全审计功能 5. **预定义配置项**: - 预订规则:最大/最小提前预订时间、当日预订、自动确认等 - 财务参数:默认货币、税率、押金比例、取消费率等 - 界面外观:主题色、品牌标识、欢迎语、页脚文本等 - 业务流程:自动分房、身份验证、确认信息、客人评价等 6. **系统配置枚举值**: - 配置值类型:`string`, `integer`, `boolean`, `json`, `decimal` - 配置状态:`active`, `inactive` - 设备类型:`iOS`, `Android`, `Web`, `MiniProgram` - 设备状态:`active`, `inactive`, `expired`, `blocked` - 小程序配置分类:`theme`, `payment`, `notification`, `function`, `security` - 配置分组:`booking_rules`, `finance_params`, `ui_appearance`, `business_process` 7. **索引优化**: - 租户配置表:`(tenant_id, dept_id, setting_group, setting_key)` 唯一索引 - 小程序配置表:`(tenant_id, dept_id, setting_key)` 唯一索引 - 用户设备表:`(tenant_id, user_id, device_id)` 唯一索引 - 查询性能优化索引:按租户、部门、分组、状态等维度 8. **菜单权限体系**: - 系统配置管理主菜单及6个子菜单 - 完整权限控制:查询、新增、修改、删除、导入、导出、批量操作 - 特殊权限:配置继承、覆盖、重置、模板应用、系统监控等 ### v5.5 (历史版本) - 订单管理和价格管理数据模型优化